2016-08-17 3 views
0

у меня есть 2 таблицы: родитель и ребенок и oneToMany отношения между родителем и ребенкомHibernate выборки родителей и всех детей, если дети отвечают критериям

@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; 
    } 
} 

Теперь я хочу принести родителю всех детей, у которых один из детям 10 или более лет, а родитель женат. Другими словами, Предположим, что P1 имеет 2 детей, c1 возраст = 11 и c2 = 8, а p1.marritalStatus женат.
Так что мой запрос должен получить P1 с c1 и c2.

Прямо сейчас это только выборка P1 с c1. Нет c2. И p1.getChildren() дает только c1.

Мои HQL выглядит следующим образом:

первый запрос, который я выполняю: получить родительский список идентификаторов

parentIDList = выбрать p.parentID от Родителя как п LEFT JOIN принести p.children, как с, где c.age> 10 и p.marritalStatus = «женился»»

Я получаю правильный родительский список ID Pass, что родительский ID (P1 в данном случае) список в 2-ом запросе

второго запроса на головной таблице (не присоединяется к детскому столу) "from Parent as p, где p.parentID IN (parentIDList)"

Поскольку FetchType - EAGER, я думал, что спящий режим будет выбирать всех детей, когда я получаю родительский элемент, но не выглядит так.

Я попытался - присоединился к таблице Child для второго запроса, но это не дает желаемого результата.

Мой 1-й запрос работает нормально, и я получаю правильный родительский список, моя проблема не получает все дочерние при выполнении второго запроса. как это решить?

ответ

0

Я должен был очистить сессию. Мне не нужно присоединяться второй раз, чтобы вытащить всех детей, так как fetchtype - EAGER.

0

Попробуйте это, чтобы получить родители, которые в браке:

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

Объяснение:

Дети знают своих родителей, так что у вас есть доступ к полям родителя.

+0

Не могу сделать - получить от детей. Я могу получить только родителя, и это дети только от родителей. – DaenKhaleesi

+0

Почему? У вас это определено для детей как поля/отношения. – javydreamercsw

0

Прежде всего, когда вы запускаете любой запрос HQL в спящем режиме, он всегда будет игнорировать режим выборки уровня Entity (fetch = FetchType.EAGER). Для получения всего вашего ребенка вместе с родителем вам необходимо явно использовать соединение. Поэтому, пожалуйста, напишите обычный запрос hql, который использует join для извлечения записи вашего дочернего стола.

+0

2-й оставшийся слева выбор извлечения дает тот же результат, что и первый. P1 с только C1. Нет C2. – DaenKhaleesi

0

Try ниже данного запроса это работает для меня ....

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

Да, используется тот же запрос, но он выбирает родительский с только C1> 10. P1 имеет 2 детей C1.age = 11 и C2.age = 8. Я хочу P1, а также все дети C1 и C2. – DaenKhaleesi

+0

Похоже, второй член времени также возвращает тот же результат. это родитель с 1 ребенком. Нужно ли обновлять? – DaenKhaleesi

+0

, если вы используете повторное использование данных ... query.setResultTransformer (CriteriaSpecification.DISTINCT_ROOT_ENTITY); – Gokul

Смежные вопросы