hibernate如何使用空字符串进行等式限制?

时间:2010-05-11 17:53:53

标签: sql hibernate criteria

我有一个可能有一些错误数据的列,我无法清理它,所以我需要检查null或空字符串。我正在做一个Hibernate Criteria查询,所以我得到了以下不正确的返回:

Session session = getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
Criteria myCriteria = session.createCriteria(Object);
...
myCriteria.add(Restrictions.or(Restrictions.isNull("stringColumn"),
                               Restrictions.eq("stringColumn", "")));
List<Objects> list = myCriteria.list();

我无法让它正确地返回我期望的结果。因此,作为一项实验,我将第二个限制改为:

 Restrictions.eq("stringColumn", "''") 

它开始返回预期的结果,所以hibernate错误地将我的空字符串(例如“”)转换为SQL空字符串(例如''),还是我只是做错了?

2 个答案:

答案 0 :(得分:4)

使用HSQL(和Derby)和以下值:

insert into FOO values (1, 'foo');
insert into FOO values (2, 'bar');
insert into FOO values (3,  NULL);
insert into FOO values (4, '');

您的条件查询

Criteria crit = session.createCriteria(Foo.class);
crit.add(Restrictions.or(Restrictions.isNull("name"), 
                         Restrictions.eq("name", "")));
crit.list();

返回:

Foo [id=3, name=null]
Foo [id=4, name=]

正如所料。

您使用的数据库是什么?可能是甲骨文吗?

答案 1 :(得分:2)

好像你做错了。 Java中的null映射到SQL中的NULL,Java中的空字符串("")映射到SQL中的空字符串(''