2011-01-13 10 views
1

Ich versuche, eine Unterabfrage mit Hibernate-Kriterien api auszuführen, aber nicht in der Lage, vollständig herauszufinden, wie es geht. Angenommen, es gibt 2 Tische, SHOPS und Mitarbeiter, wo SHOPS hat alle Geschäfte Informationen und Mitarbeiter ist ein großer Tisch aller Mitarbeiter in allen Geschäften (keine Fremdschlüssel gesetzt). Ich versuche, eine Abfrage zu schreiben, die die Shop-ID und -Adresse aus der Tabelle SHOPS abruft und dann die Anzahl der Mitarbeiter in einem Geschäft durch einen Join abruft und auf die Tabelle EMPLOYEES zählt. Etwas wie folgt aus:Hibernate-Kriterien-Abfrage

SELECT a.SHOP_ID, a.SHOP_ADDRESS, (SELECT COUNT(*) FROM 
SHOP_EMPLOYEES b WHERE b.SHOP_ID = a.SHOP_ID) as NUM_EMPLOYEES FROM <--Problem here 
SHOPS a 
WHERE 
QUERY_STATUS ='Open' 

So habe ich eine Java-Klasse-Shop mit ShopID, shopAddres, numEmployees und ähnlich für die Mitarbeiter.

Meine Unterabfrage:

DetachedCriteria subquery = DetachedCriteria.forClass(
    Employee.class, "b").add(
    Property.forName("b.shopId").eqProperty("a.shopId")) 
    .setProjection(
    Projections.projectionList().add(
     Projections.rowCount())); 

Und ein Hauptkriterium Abfrage auf den Linien von:

List shopListRet = session.createCriteria(Shop.class, "a") 
    .setProjection(
    Projections.projectionList().add(
     Projections.property("a.shopId"))).add(Subquery..."DONT KNOW WHAT SHOULD COME HERE").list(); 

Meine Frage ist:

  • Wie verknüpfe ich die Freistehendes Abfrage als ein Unterabfrage, um das Zählergebnis in einer Klassenvariablen numEmployees in der Shop-Klasse zu sammeln?

Dank -J

Antwort

2

eine SQL-Projektion Verwenden Sie die Unterabfrage hinzuzufügen.

String subSql = "SELECT COUNT(*) FROM SHOP_EMPLOYEES b WHERE b.SHOP_ID = a.SHOP_ID" 
... 
    .add(Projections.sqlProjection(
     subSql , 
     new String[] { "NUM_EMPLOYEES" }, 
     new Type[] { Hibernate.LONG } 
    ); 
+1

Hallo Danke für die Antwort. Ich musste die Abfrage ein wenig anpassen, um nach Aliasnamen zu suchen. etwa so: String subSql = "(SELECT COUNT (*) FROM SHOP_EMPLOYEES b WHERE b.SHOP_ID = {alias} .SHOP_ID) als NUM_EMPLOYEES". Arbeitete danach. Ich akzeptiere deine Antwort als richtig - Prost - J – joesatch