Anylogic中QueryDSL调用and()拼接条件查询返回错误结果问题
问题描述
在AnyLogic模型中创建名为c2d_selfpickup的数据库表,需使用QueryDSL实现根据入参SCid和PVZid查询对应c2d_lm字段值的功能。
表结构参考:
初始编写的查询代码如下:
List <Double> c2dlmList = selectFrom(c2d_selfpickup) .where(c2d_selfpickup.sc_id.goe(SCid) .and( c2d_selfpickup.pvz_id.goe(PVZid) )) .list(c2d_selfpickup.c2d_lm);
测试传入参数:
int SCid = 256151; int PVZid = 547307;
预期返回仅包含8.0的单元素列表(对应表中第8行匹配记录),实际返回包含7个值的列表:
[2.0, 3.0, 4.0, 5.0, 6.0, 8.0, 10.0]
错误原因
查询条件的方法使用错误:
- QueryDSL中
goe()方法是greater than or equal to的缩写,对应SQL的>=(大于等于)逻辑,用于范围筛选,不是精确等值匹配。 - 原代码实际执行的筛选逻辑是
sc_id >= 传入SCid 且 pvz_id >= 传入PVZid,所有满足两个字段值大于等于入参的记录都会被查出,因此返回了多条不符合预期的结果。
修正方法
精确匹配场景需要使用eq()方法(equal的缩写,对应SQL的=等值判断逻辑),修正后代码:
List <Double> c2dlmList = selectFrom(c2d_selfpickup) .where(c2d_selfpickup.sc_id.eq(SCid) .and( c2d_selfpickup.pvz_id.eq(PVZid) )) .list(c2d_selfpickup.c2d_lm);
内容的提问来源于stack exchange,提问作者dkdelta
相关产品推荐
相关产品推荐


