JFinal使用Oracle数据库时,SQL参数绑定失效的奇怪问题?报错-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

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

爱吃鱼的程序员 2020-06-09 13:57:29 61

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


SQL Oracle druid Java 关系型数据库 MySQL 数据库
分享到
取消 提交回答
全部回答(1)
  • 爱吃鱼的程序员
    2020-06-09 13:57:47

    答案在这里:

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

    解决办法:

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

    0 0
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

推荐文章
相似问题
推荐课程