2010-03-08 4 views
6

HQL에서 뭔가를하는 방법에 대해 약간 혼란 스럽습니다.HQL의 Collection.contains (Enum.Value)?

그래서 최대 절전 모드에서 계속 유지하는 Foo 클래스가 있다고 가정 해 보겠습니다. 그것은과 같이 열거 값의 집합을 포함

public class Foo 
{ 
    @CollectionOfElements 
    private Set<Bar> barSet = new HashSet<Bar>(); 

    //getters and setters here ... 
} 

public enum Bar 
{ 
    A, 
    B 
} 

내가 BarSet 나이 Bar.B을 containst who'se 만 푸 인스턴스를 가져 오는 데 사용할 수있는 HQL 문이 있습니까?

List foos = session.createQuery("from Foo as foo " + 
"where foo.barSet.contains.Bar.B").list(); 

나는 모든 Foo 인스턴스를 가져 와서 DAO 수준에서 필터링하지 않습니까?

List foos = session.createQuery("from Foo as foo").list(); 

List results = new ArrayList(); 

for(Foo f : foos) 
{ 
    if(f.barSet.contains(Bar.B)) 
    results.add(f); 
} 

고마워요!

답변

5

@CollectionOfElements 
@Enumerated(EnumType.STRING) 
@JoinTable(
    name="BAR_TABLE", 
    [email protected](name="FOO_ID") 
) 
public Set<Bar> getBarSet() { 
    return this.BarSet; 
} 

을 다음과 그리고 당신의 HQL 당신이

안부 매핑하는 방법을 볼 수 있습니다

select distinc Foo _foo inner join fetch _foo.barSet bar where bar = :selectedBar 

query.setParameter("selectedBar", Bar.A); 

query.list(); 

Here처럼 보이는 당신은

2

당신이

을 할 수있는,지도한다

"Foo as foo from : foo.barSet의 selectedBar 멤버"

+0

감사합니다. 나는 이것을 줄 것이다. – Seth

+0

이것이 작동하지 않는 것 같습니다 ... "회원"을 사용하는 방법에 대한 자습서를 가르쳐 주시겠습니까? – Seth

0

나는 일반적으로 데이터베이스에 비트 세트로 저장하는 것을 선호합니다. 그것은 엄청나게 빨라서 하나의 (!) 단일 열이 필요합니다. HQL이 비트 연산을 처리하는 방법을 모르지만 직접 등록 할 수 있습니다. 어머니 고양이에서

2

선택 어머니 키트로서 고양이 여기서 요소 (foo.kittens)의 키트

docs.jboss.org

관련 문제