2015-01-02 2 views
1

@Embeddable을 CriteriaBuilder와 함께 사용하여 포함 된 속성을 기반으로 상위 엔터티의 결과를 필터링하려고합니다. Eclipse Link를 사용하여 Metadata 클래스를 생성합니다.포함 된 개체에 Cirteria Builder 사용

@Entity(name = "Message") 
public class Message implements Serializable { 

    @Embedded 
    private Stamp stamp = new Stamp(); 

이제이 코드에 기초하여 메시지 클래스 및 필터링 결과를 사용한다 :

@Embeddable 
public class Stamp implements Serializable { 

    @Basic() 
    @Column(name = "stamp_year", nullable = false) 
    private int year; 

상위 클래스 구성원으로 스탬프가 여기

임베디드 클래스/실체 임베디드 클래스 속성 연도 :

CriteriaBuilder cb = em.getCriteriaBuilder(); 
    CriteriaQuery<Message> cq = cb.createQuery(Message.class); 
    Root<Message> root = cq.from(Message.class); 
    Predicate p = cb.conjunction(); 
    p = ?????? 
    cq.where(p); 
    TypedQuery<Message> tq = em.createQuery(cq); 
    List<Message> messages = tq.getResultList(); 

5 번 줄에서 메시지 -> 스탬프 -> Y 검색어의 귀 요소는 무엇입니까?

@StaticMetamodel(Message.class) 
public class Message_ { 

    public static volatile SingularAttribute<Message, Stamp> stamp; 

과 :

@StaticMetamodel(Stamp.class) 
public class Stamp_ { 

    public static volatile SingularAttribute<Stamp, Integer> year; 

참고 : 여기

생성 된 메타 모델 클래스이다 나는 GitHub에 볼 수 있습니다 코드 명확하지만, 전체 코드에 대한 모든 관련이없는 정보를 제거 : prototype

답변

2

기준 기반 쿼리는 다음과 같이 보일 수 있습니다.

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Message> cq = cb.createQuery(Message.class); 
Root<Message> root = cq.from(Message.class); 

Predicate p = cb.conjunction(); 
ParameterExpression<Integer> year = cb.parameter(Integer.class, "year"); 
p = cb.and(p, cb.equal(root.get(Message_.stamp).get(Stamp_.year), year)); 

cq.where(p); 

TypedQuery<Message> tq = em.createQuery(cq).setParameter("year", 2015); 
List<Message> messages = tq.getResultList(); 
관련 문제