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

简单代码 发布于 2016/06/14 06:53
阅读 282
收藏 0

@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 就不解释了


加载中
1
简单代码
简单代码

答案在这里:

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

解决办法:

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

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

StringUtils.rightPad 就不解释了
返回顶部
顶部