--------------------------------------------------------------------------------
xiaoyuonline 写道
引用
关于Hibernate的HQL语句的占位符的一个问题
首先我的环境是Hibernate + oracle9i
代码如下:
String hql = "select user.name from User user where user.name='hello'";
Query query = session.createQuery(hql);
List list = query.list();
if(list.isEmpty())
{ System.out.println(false);
} esle
{ System.out.println(true);
}
打印出来是true
但如果改写上面的代码如下:
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();
if(list.isEmpty())
{ System.out.println(false);
} esle
{ System.out.println(true);
} 打印出来就是fasle
改写query.setParameter("name","'hello'");
打印出来还是false
请问我哪个地方出错了吗?
首先我的环境是Hibernate + oracle9i
代码如下:
String hql = "select user.name from User user where user.name='hello'";
Query query = session.createQuery(hql);
List list = query.list();
if(list.isEmpty())
{ System.out.println(false);
} esle
{ System.out.println(true);
}
打印出来是true
但如果改写上面的代码如下:
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();
if(list.isEmpty())
{ System.out.println(false);
} esle
{ System.out.println(true);
} 打印出来就是fasle
改写query.setParameter("name","'hello'");
打印出来还是false
请问我哪个地方出错了吗?
经过我的测试,作者所说的问题确实存在。
但当数据库采用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时,以上语句均无任何问题。因此,不要再费劲了,至于产生此问题的详细原因及解决办法,我暂时还没想到。oracle的第三方驱动很少,datadirect还是收费的。
笨一点的解决办法,就不要再采用char类型了,想不通为什么非要用此类型不可。直接转换为varchar类型好了,绝对的正常。