开发者社区> 问答> 正文

JFinal使用Oracle数据库时,SQL参数绑定失效的奇怪问题?报错

@JFinal

JFinal 2.2 使用Oracle数据库时,非web应用,SQL参数绑定没有生效,将sql中的参数换成实际数值,可以返回正确结果,这是什么问题?

配置:Druid 最新版,ojdbc6驱动

dsOracle = new DruidPlugin(PropKit.get("oraJdbcUrl"),PropKit.get("oraUser"),PropKit.get("oraPassword"));
			dsOracle.setDriverClass("oracle.jdbc.driver.OracleDriver");
			dsOracle.setMaxActive(5);
			dsOracle.setInitialSize(1);
			dsOracle.setMinIdle(1);
			dsOracle.setValidationQuery("select 1 FROM DUAL");
			dsOracle.start();

			ActiveRecordPlugin arpOra = new ActiveRecordPlugin("oracle", dsOracle);
			arpOra.setDialect(new OracleDialect());
			arpOra.setContainerFactory(new CaseInsensitiveContainerFactory());
			arpOra.setDevMode(PropKit.getBoolean("DevMode", false));
			arpOra.setShowSql(PropKit.getBoolean("DevMode", false));
			arpOra.start();



查询代码:
String sql = "SELECT * FROM flt.mitemb mib WHERE mib.bn=?";
List<Record> queryData = Db.use("oracle").find(sql, bns.getStr("bn").trim());


说明:

1、bns.getStr("bn").trim() 是从MySQL数据库读出的待查询数据,varchar类型;

2、mib.bn字段是Oracle数据库的char类型;

如果使用参数,查询不到数据;如果将mib.bn=?换成具体数值,比如mib.bn='123456',就可以查询出数据,没报错,也不知道什么问题,请帮忙看看,谢谢。

补充:
刚做了测试,应该是判断参数类型的时候,java的string字符串绑定给Oracle的char类型字段,因为类型转换不一致,导致查询不出数据,那么问题是如何将string转换为char类型字段呢?

答案在这里:
http://blog.chinaunix.net/uid-276853-id-366493.html

解决办法:

Db.use("oracle").find(sql, StringUtils.rightPad(bns.getStr("pn").trim(), 24));

终于搞定了,留给同样问题的朋友参考。

StringUtils.rightPad 就不解释了


展开
收起
爱吃鱼的程序员 2020-06-09 13:57:29 701 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    答案在这里:

    JFinal通过SetObject赋值,自动映射类型,导致string和char类型不匹配。

    解决办法:

    Db.use("oracle").find(sql,StringUtils.rightPad(bns.getStr("pn").trim(),24))

    2020-06-09 13:57:47
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
DTCC 2022大会集锦《云原生一站式数据库技术与实践》 立即下载
阿里云瑶池数据库精要2022版 立即下载
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载

相关镜像