2012-09-14 2 views
0
class A{ 
// one to many mapping 
    List<B> listOfB; 
    //getter and setter; 
    class B { 
    String s; 
    //getter and setter 
    } 

이제 클래스 A를 얻으면 listOfB에있는 모든 관련 클래스 Bs를 반환합니다. 그러나 B가 응답해야하는 조건이 필요합니다. ListOfB에는 s = 'something'과 같은 모든 B가 들어 있습니다.내부 목록에 조건이있는 최대 절전 모드 NamedQuery

편집 : 현재이 작동하지 않습니다 :

select a from A a where a.listOfB IN (select b from a.listOfB b where b.s='something'); 

답변

0

1) 당신이

내가 생각 A.listOfB = 비비처럼 A에서 B로 일대 다 관계를 매핑한다고 가정하여

select a 
from A a, B b 
where a.listOfB = b.b 
and where b.s='something' 

가 등가 최대 절전 모드 기준 쿼리은 다음과 같습니다 : 쿼리는 다음과 같이 간단하게 할 수

이 필드 a.listOfB

List results = sess.createCriteria(A.class) 
.add(Restrictions.sqlRestriction("{alias}.listOfB in (selec b from B where b.s = ?)), "something", Hibernate.STRING)) 
    .list(); 

더 많은 예제 here 통해 SQLRestriction을 사용할 수 있습니다 이들 엔티티 사이에 매핑 아무 관계가없는 경우

2).

+0

HQL 질의는 유효하지 않습니다. b.b가 존재하지 않으며 목록을 엔티티와 비교할 수 없습니다. 게다가 이것은 OP의 유일한 문제가되지는 않을 것입니다 : 그는 여전히 각 A에있는 Bs의 완전한 목록을 얻을 것이고, 그 기준을 만족시키는 Bs는 얻지 못할 것입니다. –

0

JPA 스펙이 금지되어야한다고 말하면서도 Hibernate로 그렇게 할 수 있습니다. 실제로 A을 받으면 Bs의 목록은 항상 Bs 전체 목록이어야합니다. 일부 쿼리로 필터링 된 목록이 아닙니다. 그 일을 피하는 것은 위험하기 때문에. 오히려, 나는 같은 쿼리를 사용하는 것이 다음

이제
select a, b from A a inner join a.listOfB b where b.s = 'something' 

당신이 모든 당신이에 관심이있는 모든 기지국을 당신이에 관심이있는 것처럼 : 당신이 만약 정말

A1, B1 
A1, B2 
A2, B7 
A2, B8 

원하는 정보 Bs의 부분 목록과 마찬가지로 다음 쿼리를 사용하십시오. 그러나 당신은 경고했습니다 : 그것은 휴대 가능하지 않고 위험합니다 :

select a from A a inner join fetch a.listOfB b where b.s = 'something'