oracle的JDBC使用preparedStatement处理char类型字段的问题
2006-10-16 18:06
323 查看
整理了一下:[quote="xiaoyuonline"]关于Hibernate的HQL语句的占位符的一个问题
首先我的环境是Hibernate + oracle9i。user表中name类型为char(10),有值为hello的记录。
代码如下:
String hql = "select user.name from User user where user.name='hello'";
Query query = session.createQuery(hql);
List list = query.list();
System.out.println(list.isEmpty());
打印出来是false,说明查到了数据。
但如果改写上面的代码如下:
String hql = "select user.name from User user where user.name=:name";
Query query = session.createQuery(hql);
query.setParameter("name","hello");
List list = query.list();
System.out.println(list.isEmpty());
打印出来就是true,说明没有查到数据
[/quote]
经过我的测试,上面的问题确实存在。
但当数据库采用sql server或者mysql5时,采用char类型,没有任何问题。
所以判断该错误与hibernate本身没有关系。而与oracle的jdbc驱动有关。
试了classes12.jar和ojdbc.jar,也试过了oci驱动,均错误依旧。
我建了一个表:create table test(name char(7));内有N条值为hello的记录
第一种:不用占位符,
java.sql.PreparedStatement ps = connection().prepareStatement("select * from test where name='hello'");
java.sql.ResultSet rs = ps.executeQuery();
记录集rs有数据;
第二种:使用占位符,
java.sql.PreparedStatement ps = connection().prepareStatement("select * from test where name=?");
ps.setString(1,"hello");
java.sql.ResultSet rs = ps.executeQuery();
记录集rs中无任何数据。
将字段类型改为varchar时以上两条jdbc sql均无任何问题。因此,不要再费劲了,至于产生此问题的详细原因及解决办法,我暂时还没想到。oracle的第三方驱动很少,datadirect还是收费的。
笨一点的解决办法,就不要再采用char类型了,想不通为什么非要用此类型不可。直接转换为varchar类型好了,绝对的正常。 阅读更多
首先我的环境是Hibernate + oracle9i。user表中name类型为char(10),有值为hello的记录。
代码如下:
String hql = "select user.name from User user where user.name='hello'";
Query query = session.createQuery(hql);
List list = query.list();
System.out.println(list.isEmpty());
打印出来是false,说明查到了数据。
但如果改写上面的代码如下:
String hql = "select user.name from User user where user.name=:name";
Query query = session.createQuery(hql);
query.setParameter("name","hello");
List list = query.list();
System.out.println(list.isEmpty());
打印出来就是true,说明没有查到数据
[/quote]
经过我的测试,上面的问题确实存在。
但当数据库采用sql server或者mysql5时,采用char类型,没有任何问题。
所以判断该错误与hibernate本身没有关系。而与oracle的jdbc驱动有关。
试了classes12.jar和ojdbc.jar,也试过了oci驱动,均错误依旧。
我建了一个表:create table test(name char(7));内有N条值为hello的记录
第一种:不用占位符,
java.sql.PreparedStatement ps = connection().prepareStatement("select * from test where name='hello'");
java.sql.ResultSet rs = ps.executeQuery();
记录集rs有数据;
第二种:使用占位符,
java.sql.PreparedStatement ps = connection().prepareStatement("select * from test where name=?");
ps.setString(1,"hello");
java.sql.ResultSet rs = ps.executeQuery();
记录集rs中无任何数据。
将字段类型改为varchar时以上两条jdbc sql均无任何问题。因此,不要再费劲了,至于产生此问题的详细原因及解决办法,我暂时还没想到。oracle的第三方驱动很少,datadirect还是收费的。
笨一点的解决办法,就不要再采用char类型了,想不通为什么非要用此类型不可。直接转换为varchar类型好了,绝对的正常。 阅读更多
相关文章推荐
- oracle的JDBC使用preparedStatement处理char类型字段的问题
- oracle 索引字段包含date类型,使用spring jdbc更新时不走索引,而是走table access full的问题
- 解决在mybatis中使用CTE进行oracle查询数据类型为long的字段出现流关闭问题
- oracle 定长字段查询问题 ,ibatis 与pl/sql查询的char类型字段查询不同
- Oracle字段类型char、varchar2、nvarchar2的区别与使用
- 关于Oracle字段类型Date使用mybatis generator自动生成工具出现的查询日期只精确到年月日问题
- 解决在mybatis中使用CTE进行oracle查询数据类型为long的字段出现流关闭问题
- 使用JDBC时与Oracle的类型匹配问题
- Oracle中varchar2类型字段长度限制使用问题
- oracle 定长字段查询问题 ,ibatis 与pl/sql查询的char类型字段查询不同
- 使用Hibernate4处理Oracle XmlType字段类型
- Oracle中Number类型字段使用.netTiers和CodeSmith问题的解决方案
- 解决mybatis使用char类型字段查询oracle数据库时结果返回null问题
- oracle 定长字段查询问题 ,ibatis 与pl/sql查询的char类型字段查询不同
- Oracle中Number类型字段使用.netTiers和CodeSmith问题的解决方案
- hibernate3使用c3p0连接池调用oracle自定义对象问题处理
- jdbc中如何处理Oracle BLOB字段
- oracle中使用SQL语句修改字段类型
- ORACLE中date类型字段的处理
- 使用GeoTools遇到的两个小问题:nvarchar类型字段无法识别,主键字段无法识别