【已解决】ActiveRecord同一sql不同查询方式获取数据不一致的问题

环境:activerecord 4.8 + oracle 12c

DbPro ds1 = Db.use("oracle");
String pid = "p10";
String sql_1 = "select * from XXX where p_id=?";
String sql_2 = "select * from XXX where p_id='"+pid+"' ";
List<Record> list1 = ds1.find(sql_1,pid);
List<Record> list2 = ds1.find(sql_2);

以上两种查询方式,获取的数据竟然不一样?拼接sql方式获取的是对的,占位符的形式反而不对。

已经反复测试,确实有这个情况。原因还没细查,先把问题抛出来。新版本还未测试是否有此问题。

补充一点:这是一个多数据源的环境

2020.8.4 上午:经过测试,跟多数据源没有关系。另外我个人使用p6spy插件将最终的执行sql打印出来,发现跟手动拼接的sql是一样的,但是查询结果还是不一样。

2020.8.4 下午:问题已解决。问题出现在p_id这个字段类型上,因为系统比较老了,一开始也没往这方面想,这个字段设计的竟然是char(4)类型!!!也不知道哪个猿设计的!改成varchar,一切正常。

最后感谢波总的耐心指导,^_^。

评论区

JFinal

2020-07-28 22:23

你给出来的代码是 demo,很可能与实际不符,例如参数前后是否存在空格,这个因素对于这两种传参方式可能有影响

zhangtianxiao

2020-07-29 12:27

坐等删帖

永字诀

2020-07-30 10:07

可以直接使用plsql连接数据库试下下面两个查询的执行结果:
select * from XXX where p_id=1;
select * from XXX where p_id='1';

happyboy

2020-08-03 19:31

@永字诀 p_id字段是字符类型,不可以这么写。o(* ̄︶ ̄*)o

happyboy

2020-08-03 20:53

经过一晚的调试,还是没有发现原因,明天继续。2020-8-3

happyboy

2020-08-03 20:58

@JFinal 除了表名字,跟真实生产代码基本一致

JFinal

2020-08-04 16:29

@happyboy 寻根问底的精神,值得赞赏,赞