2016-08-17 5 views
0

Ich habe 2 Tabellen: Eltern und Kind und OneToMany Beziehung zwischen Eltern und KindHibernate holen Eltern und alle Kinder, wenn alle Kinder Kriterien erfüllen

@Entity 
@Table(name="PARENT") 
public class Parent { 
    int parentID; 
    String marritalStatus; 
    List<Child> children; 

    //getters and setters 

    @OneToMany(mappedBy = "parent", cascade=CascadeType.ALL, orphanRemoval=true, fetch = FetchType.EAGER) 
    public List<Child> getChildren() { 
    return children; 
} 
} 

@Entity 
@Table(name="CHILD") 
public class Child{ 
    private Parent parent;   //FK 
    private int age; 
    private int childID; 

    @ManyToOne 
    @JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID", nullable=false) 
    public Parent getParent() { 
     return parent; 
    } 

    public void setParent(Parent parent) { 
     this.parent = parent; 
    } 
} 

Jetzt möchte ich mit allen Kindern, deren einer der Eltern holen Kinder sind 10 oder mehr Jahre alt und Eltern sind verheiratet. Mit anderen Worten, Nehmen wir an, P1 hat 2 Kinder, c1 Alter = 11 und c2 = 8 und p1.marritalStatus ist verheiratet.
Also meine Abfrage sollte P1 mit C1 und C2 holen.

Im Moment wird nur P1 mit C1 abgerufen. Nein c2. Und p1.getChildren() gibt nur c1.

Mein HQL wie folgt aussieht:

erste Abfrage, die ich ausführen: Eltern-ID-Liste

parentIDList = select p.parentID von Eltern erhalten, wie p LEFT JOIN p.children holen als c, wo c.age> 10 und p.marritalStatus = ‚verheiratet‘“

ich richtig Eltern-ID-Liste Pässe, die Eltern-ID erhalten (P1 in diesem Fall) Liste in der 2. Abfrage

2. Abfrage auf Elterntabelle (keine zu untergeordneter Tabelle verbindet) "von Parent als p wo p.parentID IN (parentIDList)"

Da FetchType EAGER ist, dachte ich, Hibernate wird alle Kinder holen, wenn ich Eltern abholen, aber nicht so aussehen.

Ich versuchte - Join mit Child-Tabelle für die zweite Abfrage, aber es gibt kein wünschenswertes Ergebnis.

Meine erste Abfrage funktioniert gut und ich bekomme korrekte Elternliste, mein Problem wird nicht alle Kinder bekommen, wenn ich 2. Abfrage ausführen. Wie löst man das?

Antwort

0

hatte ich Sitzung zu löschen. Ich brauche nicht das 2. Mal, um alle Kinder zu ziehen, da fetchtype EAGER ist.

0

diese versuchen, die Eltern zu bekommen, die verheiratet sind:

select c.parent.parentID from Children c where c.age > 10 and c.parent.marritalStatus = 'married' 

Erläuterung:

Kinder kennen ihre Eltern, so dass Sie Zugriff auf die Felder der Eltern haben.

+0

Ich kann nicht - von Kindern bekommen. Ich kann nur Eltern bekommen und es sind nur Kinder von Eltern. – DaenKhaleesi

+0

Warum ist das? Sie haben es auf den Kindern als Felder/Beziehungen definiert. – javydreamercsw

0

Zunächst einmal, wenn Sie eine HQL-Abfrage in Hibernate abfeuern, wird es immer Ihre Entity-Ebene Abrufmodus (Fetch = FetchType.EAGER) ignorieren. Um Ihr gesamtes Kind mit Eltern zu bekommen, müssen Sie explizit beitreten. Also schreibe bitte eine normale hql-Abfrage, die Join benutzt, um deinen Kindtabellen-Datensatz zu holen.

+0

2. Mal links Join Fetch gibt das gleiche Ergebnis wie zuerst. P1 mit nur C1. Nein C2. – DaenKhaleesi

0

Versuchen unten Abfrage es für mich funktioniert ....

select p From Parent as p JOIN FETCH p.children as c where c.age >= 10 
+0

ja, verwendet dieselbe Abfrage, aber es holt Parent mit nur C1> 10. P1 hat 2 Kinder C1.age = 11 und C2.age = 8. Ich möchte P1 und auch alle Kinder C1 und C2. – DaenKhaleesi

+0

Sieht so aus, als ob der 2. Zeit-Join auch das gleiche Ergebnis liefert. das ist Elternteil mit nur 1 Kind. Benötige ich eine Aktualisierung? – DaenKhaleesi

+0

Wenn Sie wiederkehrende Daten empfangen, verwenden Sie ... query.setResultTransformer (CriteriaSpecification.DISTINCT_ROOT_ENTITY); – Gokul

Verwandte Themen