Как hibernate использует пустую строку для ограничения равенства? - PullRequest
6 голосов
/ 11 мая 2010

У меня есть столбец, в котором потенциально содержатся некоторые неверные данные, и я не могу его очистить, поэтому мне нужно проверить наличие пустой или пустой строки. Я делаю запрос 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 ]

4 голосов
/ 12 мая 2010

С 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=]

Как и ожидалось.

Какую базу данных вы используете? Это может быть Oracle?

2 голосов
/ 08 апреля 2011

Кажется, вы делаете это неправильно. null в Java отображается в NULL в SQL, а пустая строка ("") в Java отображается в пустую строку в SQL ('')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...