2016-07-08 19 views
0

Betrachten Sie das folgende Setup.Hibernate-Suchabfrage, Beschränkung nach untergeordneten Klassen?

Space.java

class Space { 

    Id id; 

    ParkingCampus campus; 
} 

class ParkingCampus { 

    Id id; 

    String country; 

} 

Dies ist nicht die genaue Struktur von meinem Projekt, aber es ist nahe genug für das, was ich zu verstehen versuchen.

Wie könnte ich eine Abfrage auf meinem 'Space' Objekt ausführen, die nur Instanzen zurückgibt, bei denen die Kindklasse 'ParkingCampus' den String 'country' auf einen bestimmten Wert gesetzt hat, zB: "UK".

Ich dachte, so etwas wie:

sessionFactory.getCurrentSession() 
    .createCriteria(String.class) 
    .add(Restrictions.eq("country", "UK")) 
    .list(); 

Aber ich bin nicht sicher, ob das richtig zusammenstellen würde. Führt Hibernate standardmäßig eine "tiefe" Suche durch, um Ergebnisse meinen Einschränkungskriterien zuzuordnen, oder muss ich etwas anderes tun, um die Abfrage so zu definieren, dass sie auf diese Weise funktioniert?

Jede Hilfe würde sehr geschätzt werden!

Antwort

1

Verwenden Sie Space als Basiskriterium, erstellen Sie einen Alias ​​für den Parkplatz Campus und fügen Sie eine Einschränkung für den Alias ​​'untergeordnetes Land nach Großbritannien hinzu.

Beachten Sie jedoch, dass Ihre Implementierung scheint ein bisschen aus, IMO. Es sollte eine Tabelle mit einem zusammengesetzten Schlüssel von parkingCampusId und spaceId geben, anstatt dass der Space die ID besitzt.

Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Space.class, "space"); 
criteria.createAlias("space.parkingCampus", "campus"); 
criteria.add(Restrictions.eq("campus.country", "UK"); 
+0

Hallo, vielen Dank für Ihre Antwort. In Anbetracht der Entitäten in einer Tabelle würde ich Ihnen zustimmen, dass der Space ein Campus-ID-Feld haben sollte. Allerdings, und korrigieren Sie mich, wenn ich falsch liege, ist der Punkt von Hibernate nicht, dass es helfen soll, diese Beziehungen für mich abzubilden? Also, nachdem ich einen Platz bekommen habe, sollte ich auch den zugehörigen Campus definieren können. Anstatt zuerst nach dem Space und dann nach der Campus-ID zu suchen, um das gewünschte Ergebnis zu erhalten? – Adam

+0

Zunächst ja, aber Sie wollen ein Viele-zu-Eins-Mapping verwenden: http://www.tutorialspoint.com/hibernate/hibernate_many_to_one_mapping.htm Grundsätzlich, was Sie haben, ist als "grobe Skizze" geeignet, aber Sie wollen die Beziehungen so zu implementieren, dass der Campus zum Beispiel eine faule Sammlung von Räumen mitbringt, mit denen man arbeiten kann. – Compass