2015-12-03 1 views
0

У меня есть родительский класс:пункт Hibernate @Where на основе одного до нескольких относительных

@Entity 
public Class Parent 
{ 
    @OneToMany(fetch=FetchType.LAZY, mappedBy="parent") 
    public List<Child> children; 
} 

и ребенка класса:

@Entity 
public Class Child 
{ 
    @ManyToOne(fetch=FetchType.Lazy) 
    @JoinColumn(name="parent") 
    public Parent parent; 

    @Column(name="isActive") 
    public boolean isActive; 
} 

теперь я хочу использовать пункт @Where, чтобы Hibernate нагрузки только родители со всеми детьми неактивными.

Как это сделать с помощью @Where или любого другого метода?

Update:

результат я хочу получить, как это SQL запрос:

SELECT p.* 
FROM Parent p LEFT JOIN Child c ON c.parentid = p.id 
WHERE c.isActive = 0 

ответ

0

Это должно сделать:

@Entity 
    public Class Parent 
    { 
     @OneToMany(fetch=FetchType.LAZY, mappedBy="parent") 
     @Where(clause = "isActive = false") 
     public List<Child> children; 
    } 


Обновленный ответ после новой информации:

Так что, чтобы это сделать, невозможно le (по крайней мере, насколько мне известно). Единственный способ я знаю, чтобы использовать пользовательский запрос, что-то вроде этого:

String query = "SELECT p FROM Parent p LEFT JOIN p.children Child WHERE children.isActive = 0"; 
    Query newquery = em.createQuery(query, Parent.class); 
    List<Parent> parents = newquery.getResultList(); 

эм является EntityManager.

!! Я не уверен насчет п.т. Если он не работает, пожалуйста, попробуйте с p.child

+0

это не то, что мне нужно, пожалуйста, проверьте мое обновление –

+0

@AliBaghdadi пожалуйста, проверьте мой обновленный ответ – Mihai

+0

Это не что мне нужно, так как я обновляю устаревший код, где я не могу выполнять этот запрос всюду, но спасибо в любом случае –

0

Вы можете использовать следующую аннотацию, чтобы получить цель:

@OneToMany(fetch=FetchType.LAZY, mappedBy="parent") 
@LazyCollection(LazyCollectionOption.TRUE) 
public List<Child> children; 

ИЛИ

@OneToMany(fetch=FetchType.LAZY, mappedBy="parent") 
@LazyCollection(LazyCollectionOption.EXTRA) 
public List<Child> children; 

Но будьте осторожны со вторым, например, вам может возникнуть проблема, если вы попытаетесь получить некоторые метаданные из списка childer: https://hibernate.atlassian.net/browse/HHH-1491

Ошибка все еще существует в спящем 5.0.1 финале.

Однако, если вы будете использовать LazyCollectionOption.TRUE и будете пытаться получить Childen размера, вы получите все детские данные

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