2012-12-17 11 views
5

Oto moja HQL:Wsporniki w HQL nie ntranslated do SQL

Query query = createQueryOnCurrentSession("DELETE Email e " + 
       "where " + 
       "(status = :sent and creationTime <= :creation)" + 
       "or " + 
       "(status = :error and maxEttempts >= :maxEttempts)"); 

Oto generowane SQL:

delete from `email` where `status`=? and `creation_time`<=? or `status`=? and `attempts`>=? 

Pytanie: dlaczego są wsporniki nie w SQL? Spodziewam się, że będzie:

delete from `email` where (`status`=? and `creation_time`<=?) or (`status`=? and `attempts`>=?) 

może być alternatywą będzie usunąć w 2 wnioski?

delete from `email` where `status`=? and `creation_time`<=? 
delete from `email` where `status`=? and `attempts`>=? 
+0

spróbować ucieczki nawiasy tak: '\ (' –

+0

pojedynczy '” \ ("' nie kompiluje (oczywiście) i podwójnie '" \\ ("' throw throw: 'org.hibernate.QueryException: nieoczekiwany znak: '\' [DELETE com.grroo.model.Email e gdzie \ (status =: wysłana i creationTime <=: tworzenie \) lub \ (status =: błąd i próby> =: maxAttempts \)] ' – urir

+0

Myślę, że ty można dołączyć ciąg kwerendy jako warunek, a następnie wykonać –

Odpowiedz

8

To właściwie funkcja.

Ponieważ and ma pierwszeństwo przed or, hibernacja wie o tym i usuwa nawiasy.

Nie potrzebujesz tych nawiasów.

+0

Wiem, że tak jest w niektórych bazach danych ... ale czy jest to standard dla wszystkich DB kiedykolwiek użyję? Czy możesz się odwołać? Nie mogłem go znaleźć ... – urir

+0

Nie jestem pewien, czy jest to stały standard, ale musi DB używać go w ten sposób. – Jaanus

+0

To właśnie mnie niepokoi. Może jest jakiś sposób, aby powiedzieć hibernacji, aby opuścić nawiasy? – urir

2

operator logiczny i ma wyższy porządek pierwszeństwa niż operator logiczny OR

dla operatora pierwszeństwa, należy kliknąć link

http://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html 
http://msdn.microsoft.com/en-us/library/ms190276.aspx 

http://docs.oracle.com/html/A85397_01/operator.htm#997691 
+0

Tutaj są tylko najwięksi 3 dostawcy DB, którzy oczywiście używają tego standardu. – Jaanus