当前位置:   article > 正文

Hibernate查询oracle数据库char类型字段,获取不到结果的问题_hibernate oracle char

hibernate oracle char

问题分析:

1)去掉按月份搜索的条件是可以的查询到数据。

2)拼接sql的形式是可以查询到信息的数据。

3)用其他Varchar2类型的字段动态绑定参数查询是可以的。

  1. /**
  2. * YM 在数据库为char类型,字符长度为8,而字段为年月 例如:202101,而要和数据库中char类型的长度一致,长度不够的,用空格补齐。
  3. */
  4. if (StringUtils.isNotEmpty(ym)) {
  5. sql += " and mapp.YM=:YM";
  6. params.put("YM", ym);
  7. }

结论:该问题可能和字段类型和hibernate的动态绑定有关系。

查询材料解释:

https://community.oracle.com/tech/developers/discussion/comment/506702#Comment_506702

  1. Select * From table Where column = ?
  2. setObject(1, "compValue")
  3. will never return anything if the type of column would be e.g. CHAR(20)
  4. This behaviour is inconsistent to executing the same select as statement in the following form
  5. Statement.executeQuery(Select * From table Where column = "compValue")
  6. which will return all rows, where the value matches.
  7. The difference in the behaviour lies in the fact, that for a PreparedStatment the number of characters must match.
  8. ==================================================================================
  9. use setFixedCHAR(....).,
  10. quote from Oracle9i JDBC API Docs
  11. public void setFixedCHAR(int paramIndex,
  12. java.lang.String x)
  13. throws java.sql.SQLException
  14. Sets the disignated parameter to a String and executes a non-padded comparison with a SQL CHAR.
  15. CHAR data in the database is padded to the column width. This leads to a limitation in using the setCHAR() method to bind character data into the WHERE clause of a SELECT statement--the character data in the WHERE clause must also be padded to the column width to produce a match in the SELECT statement. This is especially troublesome if you do not know the column width.
  16. setFixedCHAR() remedies this. This method executes a non-padded comparison.

大体意思就是说采用CHAR类型,是固定类型,如果长度不够会用空格补齐,因此采用PreparedStatement动态参数绑定查询时,要采用 OraclePreparedStatement 的setFixedCHAR() 设置char类型的字段。

解决办法:

Hibernate底层是基于PrepardStatement的,但是设置参数是没办法指定setFixedCHAR(),常用的时采用如下方式 query.setParameter(key, map.get(key)); 因此使用setFixedCHAR()的方式行不太通。

1)将字段trim化,去除空格(不推荐,如果在该字段上有索引的化,索引会不起作用)。

  1. if (StringUtils.isNotEmpty(ym)) {
  2. sql += " and trim(mapp.YM)=:YM";
  3. params.put("YM", ym);
  4. }

2)将字段类型改为varchar2类型 (项目中使用,推荐使用)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/497559
推荐阅读
相关标签
  

闽ICP备14008679号