2013-06-18 2 views
0

그들 사이의 종속성이있는 일부 모델이 있습니다. 여기 모델은 다음과 같습니다 당신이 C라는 이름의 모델을 볼 수 있듯이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; 
} 

AB라는 이름의 하나 개의 모델이라는 여러 모델이 포함되어 있습니다. 내가하고 싶은 무엇

는 모두 (자신의 id에 의해 구별되는) 별개의 모델 B있는 모델 C하고를 선택하는 가장 큰 date (현재 날짜에 가까운). 또한 모델 C (A 및 모델 B 목록)의 종속성을 선택하고 싶습니다. 나는이 쿼리와 종속 C (모델 B의 ID로 구별)만을 별개의 모델을 검색 할 수 있습니다 생각

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

:

나는 모든 모델 C와 종속성을로드하는 쿼리를 :

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 

도와 주시겠습니까? 나는이 c2c3과 종속성을 검색하고 싶은

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 

: 여기

데이터의 예입니다.

는 가져 활용을 위해 becareful, 너무 HQL과 또한, 당신의 도움이

답변

0

당신에 의해 주문을 사용할 수 있습니다에 대한 귀하의하지, 조인 왼쪽을하는 것입니다 조인 의무 valide을 주셔서 감사합니다.

최대 (modelC.lastUpdate는) 아마도이 시도하거나 c.modelC.lastUpdate

예를

query = "select u from User u " 
+ "left join u.linkedAccounts linkedAccounts " 
+ "where u.active = true " 
    + "and **linkedAccounts.providerKey** = :pProviderKey"),