2017-03-14 4 views
1

Ich habe zwei Tabellen, Junge und Mädchen. Nehmen wir an, dass Jungen- und Mädchentische eine Beziehung von vielen zu vielen haben. In meiner Jungen Einheit habe ich den folgenden Satz definiert:Hibernate konnte Resultset Ausnahme nicht extrahieren - viele zu viele Relation

@ManyToMany(fetch = FetchType.LAZY) 
public Set<Girl> getGirls() { 
    return girls; 
} 

den nun in der Mädchen-Einheit habe ich den folgenden Satz definiert:

@ManyToMany(fetch = FetchType.EAGER) 
@JoinTable(name = "boy_girl", joinColumns = {@JoinColumn(name = "girl_id")}, inverseJoinColumns = {@JoinColumn(name = "boy_id")}) 
public Set<Boy> getBoys() { 
    return boys; 
} 

Ich versuche, die Mädchen von den Jungen retreive. Mit anderen Worten, ich möchte eine Liste von Mädchen für eine bestimmte BoyId. Hier ist die HQL ich verwende und ich bekomme die Fehler bereits erwähnt:

String query = "FROM Girl g inner join Boy b where b.boyId = :boyId"; 

Session session = getSessionFactory().getCurrentSession(); 
Set<Girl> girlSet = new HashSet<Girl>(); 
girlSet = (Set<Interaction>) session.createQuery(query).setParameter("boyId", boyId).getResultList(); 

Hier sind die genauen Fehler:

HTTP Status 500 - Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet 

Irgendwelche Ideen? Vielen Dank!!

+0

Ist die Spalte "girl_id" Sie existieren wird Bezug join? – Vollmilchbb

+0

Das Set girlSet = new HashSet (); 'kompiliert? – davidxxx

+1

Sie können die Eigenschaft 'show sql' in Hibernate aktivieren, um die generierte Abfrage zu sehen und zu beobachten, was sie von der Datenbank erhält. Wenn Hibernate nicht tatsächlich in die Abfragegenerierungsphase kommt, wäre diese Tatsache auch eine gute Information. –

Antwort

0

Ausprobieren hinzufügen mappedBy wenn Ihre Planung diese Beziehung als bidirektionaler hier zu haben:

@ManyToMany(fetch = FetchType.LAZY, mappedBy = "boys") 
public Set<Girl> getGirls() { 
    return girls; 
} 

Ich schlage vor, nicht die @ManyToMany auch so eifrig .. aber seine Ihren Anruf Markierung würde.

ändern schließlich die Abfrage:

String query = "FROM Girl g inner join g.boys b where b.boyId = :boyId"; 
+0

Vielen Dank für Ihre Antwort. Warum wäre es eine schlechte Idee, die vielen zu viele als eifrig zu markieren? – Panos

+1

Es kann viele unnötige Joins geben, wenn Sie diese Daten für einige Abfragen nicht wirklich benötigen (insbesondere, wenn diese Entitäten eifrig ihre eigene Menge abrufen). Aber vielleicht benötigst du diese Info immer wieder ... deshalb habe ich gesagt, dass du deinen Anruf hast –

+0

Ich möchte der Vollständigkeit halber darauf hinweisen, dass du mit Maciejs Anfrage ein Objekt [] erhältst, das sowohl einen Jungen als auch einen ein Mädchenobjekt. Um nur die Mädchen zu erhalten, sollte die Abfrage wie folgt bearbeitet werden: SELECT g FROM Girl g inner join g.boys b wo b.boyId =: boyId – Panos