2013-06-18 7 views
0

У меня есть модели с зависимостями между ними. Вот модели:Группируйте и присоединяйтесь к Hibernate и JPA

@Entity 
public class A extends Model { 
    @Required 
    public String name; 

    @Required 
    @ManyToOne(fetch = FetchType.LAZY) 
    public C modelC; 
} 

@Entity 
public class B extends Model { 
    @Required 
    public String name; 
} 

@Entity 
public class C extends Model { 
    @Required 
    public Date lastUpdate; 

    @Required 
    @OneToMany(mappedBy = "modelC", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    public List<A> modelsA; 

    @Required 
    @ManyToOne(fetch = FetchType.LAZY) 
    public B modelB; 
} 

Как вы можете увидеть модель под названием C содержит несколько моделей с именем A и одну модель под названием B.

То, что я хотел бы сделать, это выбрать все модели C, которые имеют четкую модель B (отличные от их id) и которые имеют самый большой date (ближе к текущей дате). Кроме того, я хотел бы выбрать зависимости модели C (список A и модели B).

У меня есть запрос, чтобы загрузить все модели C и его зависимость:

select distinct c from C c 
left join fetch c.modelsA 
left join fecth c.modelB 

Я думаю, что я могу получить только различные модели C (отличные от идентификатора модели B) и его зависимости с этим запросом :

select distinct c from C c 
left join fetch c.modelsA 
left join fetch c.modelB b 
group by b.id 

Однако, как я могу извлечь различные модели C с самой высокой датой? Это не работает:

select distinct c, max(c.lastUpdate) as maxUpdate from C c 
left join fetch c.modelsA 
left join fetch c.modelB b 
group by b.id 

Вы можете мне помочь?

Ниже приведен пример данных:

B(b1): 
    name: First model of type B 

B(b2): 
    name: Second model of type B 

C(c1): 
    lastUpdate: 100 
    modelB: b1 

C(c2): 
    lastUpdate: 200 
    modelB: b2 

C(c3): 
    lastUpdate: 300 
    modelB: b1 

A(a1): 
    name: A1 
    modelC: c1 

A(a2): 
    name: A2 
    modelC: c1 

A(a3): 
    name: A3 
    modelC: c2 

A(a4): 
    name: A4 
    modelC: c3 

Я хотел бы получить эту c2 и c3 и их зависимостей.

Спасибо за вашу помощь

ответ

0

вы можете использовать порядок К, к тому же с HQL вашей не обязано делать присоединиться к левому, Join является Валидой тоже Becareful для использования выборки.

макс (modelC.lastUpdate) возможно попробовать это или c.modelC.lastUpdate

пример

query = "select u from User u " 
+ "left join u.linkedAccounts linkedAccounts " 
+ "where u.active = true " 
    + "and **linkedAccounts.providerKey** = :pProviderKey"), 
Смежные вопросы