2009-11-05 7 views
8

Ich möchte beitreten auf TASK Tabelle links hinzuzufügen, wenn die folgende Bedingung auftritt: LEFT JOIN FETCH PROMPT p auf (t.id = p.task.id und p.applicationName in ('XXX'))Hibernate HQL: wie eine komplexe links verwenden join holen

Hier ist meine HQL-Abfrage:

select 
      distinct t   
     from 
      TASK t 
     LEFT JOIN FETCH 
      SERVER ser 
       on t.id=ser.task_id 
     LEFT JOIN FETCH 
      APPLICATION app 
       on ser.id=app.server_id   
     LEFT JOIN FETCH 
      PROMPT p on (t.id = p.task.id and p.applicationName in ('XXX')) 
     where 
      t.id=ser.task.id 
      and ser.id=app.server 
      and app.name in ('XXX') 
     order by t.id 

ich die folgende Ausnahme erhalten, wahrscheinlich wegen "auf" Stichwort:

java.lang.NoSuchMethodError: org.hibernate.hql.antlr.HqlBaseParser.recover(Lantlr/RecognitionException;Lantlr/collections/impl/BitSet;)V 

     at org.hibernate.hql.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:771) 

Irgendwelche Ideen?

class Task { 
    private String taskId; 
    private Set<ServerDetails> servers; 
} 

class ServerDetails { 
    private String id; 
    private Set<ApplicationDetails> applications; 
} 

class ApplicationDetails { 
    private String id; 
} 

    Class Prompt { 
     private String applicationName; 
    } 

Wie kann ich links JOIN holen in meinem Zustand p.applicationName mit ('XXX')?

+0

Die von Ihnen gepostete Klassenstruktur (ich gehe davon aus, dass für alle diese Eigenschaften entsprechende Anmerkungen vorhanden sind) verknüpft Prompt nicht mit anderen Klassen. Sie SQL verbindet 'Prompt' und' Task' über 'task_id', aber es gibt keine passenden Eigenschaften oben. Ist "Aufgabe" eine Eigenschaft auf "Eingabeaufforderung"? Oder umgekehrt? Könntest Du das erläutern? – ChssPly76

Antwort

23

Es gibt mehrere Probleme hier:

  1. Ihre HQL, wie Sie es geschrieben haben nicht wirklich HQL ist :-) Es gerade nach oben SQL ist. Für HQL müssen Sie zugeordnete Zuordnungen verwenden, um Tabellen zu verbinden. Siehe unten für eine verbesserte Version.
  2. Soweit ich weiß ON Klausel unterstützt nicht mehrere verbundene Bedingungen in Klammern.
  3. NoSuchMethodError ist nicht etwas, das Hibernate werfen würde :-) Sie haben wahrscheinlich eine ältere Version von antlr.jar irgendwo in Ihrem Klassenpfad und es wird anstelle von dem von Hibernate erwartet abgeholt. Finde es und entferne es.

Ohne Ihre Zuordnungen folgende zu sehen, ist wahrscheinlich ungenau, aber ich werde auf das Schreiben der geeignetere HQL einen Stich nehmen:

select distinct t   
    from TASK t 
    left join fetch t.server ser 
    left join fetch ser.application app 
    left join t.prompt p with p.applicationName in ('XXX') 
order by t.id 

Beachten Sie, dass prompt nicht geholt, weil man nicht join fetch verwenden können zusammen mit with Zustand. Sie können es durch inner join fetch und where ersetzen, wenn die Zuordnung erforderlich ist.

Wenn Sie nach dem Lösen des Klassenpfadproblems weiterhin Probleme haben, können Sie Ihre Zuordnungen posten, wenn Sie Hilfe bei der tatsächlichen HQL benötigen.

+0

@ ChssPly76: Ich bin erstaunt, wie gut Sie die Innereien von Hibernate kennen, ich vermute, Sie müssen entweder von Anfang an mit ihm gearbeitet haben oder Sie haben tatsächlich Code das Projekt oder beides - so oder so ist es großartig, Sie hier zu beleuchten die Codermassen. –

+1

Jetzt wirst du Gavin eifersüchtig machen. Ich mache natürlich Witze :-) - Danke. – ChssPly76

+0

Danke für Ihre Antwort, aber ich muss immer noch abholen. Wie kann ich link join ** fetch ** mit meiner Bedingung p.applicationName in ('XXX') verwenden? – Keren