DAO.deletebyids这个方法是不是有bug

debug发现逻辑里面有个根据参数的个数和表的主键字段个数作对比,不一样就报错

微信图片_2025-05-23_170338_368.jpg

评论区

JFinal

2025-05-23 17:10

对比主键名数量与主键值数量,保障基本的参数正确

sbw

2025-05-23 17:11

@JFinal 主键就一个啊 这个方法不是传入多个id根据id删除吗

zzutligang

2025-05-23 17:42

@sbw 你理解错了,这个方法是传递复合主键的,复合主键有几个字段,这里就要传递几个值,这个方法功能还是删除一条数据。并不是你理解的传递多个主键值可以删除多条记录。

杜福忠

2025-05-23 22:56

@sbw Db.deleteByIds("user_role", "user_id, role_id", 123, 456); 是这样用的,不校验传入参数与表主键数量;
对应的sql是:DELETE FROM user_role WHERE user_id=123 AND role_id=456
注意是 AND 条件 ,不是OR 条件。

Model 是数据库表的映射对象,拼接sql前 校验ids数量没毛病。两个入口功能不一样。

PS:我们项目有自己封装一个D.java类,里面扩展了Db类的用法,其中就有传入一个ids list参数批量删除的(list参数是因为json传入的对象)。自己的类工具可以随意扩展贴合业务。

星矢

2025-05-26 09:29

这方法是复合主键的删除, 跟批量删除不是一个玩意。

sbw

2025-05-28 09:24

sbw

2025-05-28 09:24

sbw

2025-05-28 09:24

shisan27

2025-07-02 17:58

也可以试试这种方式.
# 假设tablename= xyaaaa , bean = Xyaaa
sql = "update xyaaaa set on_flag=31 WHERE project_code=#para(project_code) and kind=#para(kind) and find_in_set(id,#para(idsss) )>0 ";
sqlParaMap = new HashMap();
sqlParaMap.put("project_code", makerDataPojo.getProjectCode());
sqlParaMap.put("kind", kind);
sqlParaMap.put("idsss", StringUtils.join(string31, ","));

方式1: XyDbUtil.updataDb(new XySqlBean(XyEnv.ConfPara.dbBackMain, sql, sqlParaMap));

public static XySqlBean updataDb(XySqlBean xySqlBean) {
if (xySqlBean == null) {
return xySqlBean;
} else {
try {
DbPro dbPro = (DbPro)dbProMap.get(xySqlBean.getDbname());
SqlPara sqlPara = dbPro.getSqlParaByString(xySqlBean.getSql(), xySqlBean.getSqlParaMap());
int update = dbPro.update(sqlPara);
xySqlBean.setResult(update);
} catch (Exception var7) {
logger.error("error:" + XyJsonUtil.gsonObjToStr(xySqlBean) + "\n", var7);
} finally {
if (logFlag) {
logger.info(xySqlBean.toString());
}

}

return xySqlBean;
}
}

此例子为逻辑删除, 也可以使用delete 真删除

shisan27

2025-07-02 18:01

上面这个case中, _MappingKit 里面的arp.addMapping 后面的primarykey 可能是多个. 比如这个? arp.addMapping("xypb_common_project", "c_project_code,id", XypbCommonProject.class);

热门反馈

扫码入社