2016-03-19 12 views
2

Ich habe folgende Struktur: Bank hat Namen und Liste der Büros. Büro hat city Eigentum.Ruhezustand wählen Eltern mit Liste der Kinder entspricht Kind Parameter

Wie kann ich wählen Banks mit ihren eigenen Listen Büros nur mit bestimmten Stadt mit HQL?

Code:
Bank

@Entity 
@Table(name = "BANKS") 
public class Bank { 
    public Bank() { 
    } 

    public Bank(String name) { 
     this.name = name; 
    } 

    @Id 
    @Column(name = "ID") 
    @GeneratedValue 
    private int id; 

    @Column(name = "name") 
    private String name; 

    /*@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)*/ 
    @OneToMany(mappedBy = "bank", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true) 
    /*@JoinColumn(name = "BANK_ID")*/ 
    private List<Office> officeList; 

Büro

@Entity 
@Table(name = "OFFICES") 
public class Office { 
    public Office() { 
    } 

    public Office(String city, String address, String workingHours, Bank bank) { 
     this.city = city; 
     this.address = address; 
     this.workingHours = workingHours; 
     this.bank = bank; 
    } 

    @Id 
    @Column(name = "ID") 
    @GeneratedValue 
    private int id; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "BANK_ID") 
    @JsonBackReference 
    private Bank bank; 

    public void setBank(Bank bank) { 
     this.bank = bank; 
    } 

    public Bank getBank() { 
     return bank; 
    } 

    @Column(name = "CITY") 
    private String city; 

    @Column(name = "ADDRESS") 
    private String address; 

    @Column(name = "WORKING_HOURS") 
    private String workingHours; 

Ich habe Wunsch geschrieben, aber es funktioniert falsch:

sessionFactory.getCurrentSession().createQuery("select b from Bank b join b.officeList o" + 
       " where o.city = ?").setString(0, city).list(); 

Jede Hilfe wird sehr geschätzt.

+1

Sie müssen Ihren SQL-Code hinzufügen und zeigen uns Ihre Bemühungen bis jetzt –

+0

Diese Abfrage sieht aus wie es funktionieren sollte. Gibt es eine leere Liste zurück oder gibt es eine Ausnahme? – Pace

+0

@Pace, gibt es jede Liste von Banken zurück, deren Liste von Büros mindestens ein Büro mit erforderlicher Stadt enthält, und wenn die Büroliste der Bank zwei oder mehr übereinstimmende Elemente enthält, wird diese Bank gleich oft zurückgegeben. Aber ich brauche Ergebnis, um BankList mit OfficeLists zu enthalten, die nur übereinstimmende Eigenschaft enthalten. – SHaaD

Antwort

1

den ersten Punkt betrifft, so sind Duplikate zu erwarten, weil Sie mit einer Sammlung verbinden, und man kann sie leicht mit distinct beseitigen:

select distinct b from Bank b join b.officeList o where o.city = :city 

Der zweite Punkt (das officeList nur die passende Eigenschaft enthält) ist vom Konzept her sehr trickreicher. Der Punkt ist, dass während der Initialisierung der officeList Sammlung für eine Bank Instanz Hibernate alle mit der entsprechenden Bank verbundenen Büros lädt. Genau das soll Hibernate tun: Den Datenbankzustand im Objektgraphen widerspiegeln. Das hat nichts zu tun, welche Entitäten/Tabellen Sie beigetreten sind und welche where Bedingungen Sie in der ursprünglichen Abfrage angegeben haben, die Sie verwendet haben, um die Bank abzurufen.

Es gibt jedoch die Möglichkeit, unter Verwendung des [left] join fetch-Konstrukts untergeordnete Verknüpfungen in der gleichen Abfrage zu initialisieren, in die Sie Eltern laden. Um zum Beispiel alle Banken laden zusammen mit all ihren Büros in einer Abfrage, die Sie tun können:

select distinct b from Bank b left join fetch b.officeList 

Hibernate unterstützt Aliasing und die Verwendung der fetch verbundenen Einheiten weiter in where Zustand. Auf diese Weise initialisieren Sie die Sammlung grundsätzlich nur mit der Teilmenge der Elemente, die sich in der Datenbank befinden. Also, um zu erreichen, was Sie müssen Sie Ihre Abfrage ändern könnten:

select distinct b from Bank b join fetch b.officeList o where o.city = :city 

jedoch bedenken, dass die Verwendung fetch verbundenen Assoziationen in Filterbedingungen in Abfragen werden nicht von der JPA-Spezifikation unterstützt. Außerdem sollten Sie untersuchen, welche Auswirkungen der Cache der zweiten Ebene hat, wenn Sie ihn verwenden und diese Sammlung dort zwischengespeichert wird.

+0

Hallo, mein Herr. Danke für die ausführliche Antwort, auch ich konnte das verstehen ^^. Es funktioniert perfekt. – SHaaD

Verwandte Themen