2010-05-11 21 views
6

Mam kolumnę, która potencjalnie ma jakieś złe dane i nie mogę go wyczyścić, więc muszę sprawdzić, czy jest pusty, czy pusty. Robię hibernacji kryteria zapytania więc mam następujące zwracającą nieprawidłowo teraz:W jaki sposób hibernacja używa pustego ciągu dla ograniczenia równości?

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(); 

nie mogę zmusić go do powrotu poprawnie wyniki będę oczekiwać. Więc jako eksperyment Zmieniłem drugie ograniczenie czytać:

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

I zaczęło wracać oczekiwanych rezultatów, więc jest hibernacja nieprawidłowo tłumaczenia mój pusty ciąg znaków (np „”) w SQL pusty ciąg znaków (np „”) czy po prostu robię to źle?

+0

Która baza danych używasz - puste struny mają różne zachowania w różnych DBS – Mark

Odpowiedz

4

Z HSQL (i Derby) oraz następującymi wartościami:

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

You kryteria kwerendy

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

powraca:

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

jak oczekiwano.

Jaką bazę danych używasz? Czy to może być Oracle?

2

Wygląda na to, że robisz to źle. null w Javie mapuje NULL w SQL, a pusty String ("") w Javie mapuje do pustego ciągu znaków w SQL ('')

Powiązane problemy