2012-03-28 9 views
14

Ich muss zwei JPA-Entitäten auf einer Eigenschaft verbinden, wenn keine FK/PK-Beziehung zwischen den beiden vorhanden ist. Ich bin mit Hibernate und HQL-Abfrage wie dieseVerknüpfen Sie zwei nicht verwandte Tabellen mit JPA EntityManager

select foo, bar from FooEntity as foo, BarEntity as bar 
where foo.someothercol = 'foo' and foo.somecol = bar.somecol 

jedoch verwenden können, möchte ich die Abhängigkeit von Hibernate zu vermeiden und EntityManager stattdessen verwenden. Bitte helfen.

Antwort

19

Ihre Abfrage ist gültig für JPQL und verwendet keine Hibernate-spezifische Funktionalität (nur Leerzeichen zwischen Balken und von fehlt). In JPA 2.0-Spezifikation (4.4.5 Joins) wird dies mit folgenden Worten erklärt:

eine innere Verknüpfung kann implizit durch die Verwendung eines kartesisch Produkt in der FROM-Klausel und eine Join-Bedingung in der WHERE-Klausel angegeben werden . Wenn keine Join-Bedingung vorliegt, wird der Wert auf das kartesische Produkt reduziert. Der Hauptanwendungsfall für diesen verallgemeinerten Verknüpfungsstil ist, wenn eine Join-Bedingung keine Fremdschlüsselbeziehung einbezieht, die einer Entitätsbeziehung zugeordnet ist. Beispiel: SELECT c FROM Customer c,

Mitarbeiter e WHERE c.hatsize = e.shoesize

Haupt Unterschied zu Ihrer Anfrage ist, dass Ihre wählen Sie zwei Arten von Einheiten enthält. Ergebnis der Abfrage ist Objektliste []. Die Reihenfolge der Elemente im Array ist dieselbe wie in der Anweisung . Folgendes funktioniert in Ihrem Fall:

String query = 
    "select foo, bar from FooEntity as foo, BarEntity as bar "+ 
    "where foo.someothercol = 'foo' and foo.somecol = bar.somecol"; 
List<Object[]> results = em.createQuery(query).getResultList(); 

for (Object[] fooAndBar: results) { 
    FooEntity foo = (FooEntity) fooAndBar[0]; 
    BarEntity bar = (BarEntity) fooAndBar[1]; 
    //do something with foo and bar 
} 
+0

der Raum fehlte zwischen bar und von ist beendet! –

Verwandte Themen