2012-12-17 9 views
5

Hier ntranslated ist mein HQL:Brackets in HQL nicht auf SQL

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

Hier ist die erzeugte SQL:

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

Frage: Warum sind die Klammern nicht in der SQL? Ich würde erwarten, dass es sein:

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

kann als Alternative I in 2 Anfragen löschen wird?

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

versuchen, die Klammern zu entkommen etwa so: '\ (' –

+0

Single '“ \ ("' kompiliert (natürlich) nicht und verdoppelt '" \\ ("' Ausnahme auslösen: 'org.hibernate.QueryException: unexpected char: '\' [DELETE com.grroo.model.Email e where \ (status =: sended und creationTime <=: creation \) oder \ (status =: error und versuche> =: maxAttempts \)] ' – urir

+0

Ich denke du kann Abfrage-String als Ihre Bedingung dann ausführen –

Antwort

8

Es ist eigentlich eine Funktion.

Da and Vorrang vor or hat, kennt Hibernate es und entfernt Klammern.

Sie brauchen diese Klammern dort nicht.

+0

Ich weiß, es ist so in einigen Datenbanken ... aber ist es ein Standard für alle DB werde ich jemals verwenden? Können Sie sich bitte darauf beziehen? Ich konnte es nicht finden ... – urir

+0

Ich bin nicht sicher, ob es ein fester Standard ist, aber DBs müssen es so verwenden. – Jaanus

+0

Genau das beunruhigt mich. Vielleicht gibt es eine Möglichkeit zu sagen, Winterschlaf die Klammern zu verlassen? – urir

2

Logischer Operator UND hat eine höhere Rangordnung als logischer Operator ODER

für Operator Vorrang, folgen Sie dem 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

Hier sind nur die größten 3 DB-Anbieter, die natürlich diesen Standard verwenden. – Jaanus