2011-01-21 3 views
2

기본 질문 :
ManyToOne 필드 x가있는 엔티티 B가 다른 엔티티 A에 연결된 경우 x 필드에 A가있는 B의 인스턴스를 모두 얻으려면 어떻게해야합니까? 더 구체적으로
JPA ManytoOne 관계로 쿼리를 작성하는 방법은 무엇입니까?


:
다음 entites 고려 : 이미이 쿼리는 여기에

Query query = em.createQuery("SELECT m from Message m WHERE m.owner = :us"); 

준비가

public class User { 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "USER_ID") 
private Key id; 
@OneToMany(mappedBy = "owner", cascade = CascadeType.ALL) 
private List<Message> messages; 
} 

ic class Message { 
@Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column (name="MESSAGE_ID") 
    private Key id; 
    @ManyToOne(fetch = FetchType.LAZY) 
    private User owner; 
    private int status; 
} 

내가 구축하고자하는 방법에 대한 API입니다 :
입력 : 사용자 u, 상태 s
출력 : 소유자 u 및 상태 s 인 모든 메시지 목록.

EntityMenager를 사용하여 쿼리를 작성해야하지만 적절한 구문은 무엇입니까? 이 부분에 무엇을 넣어야합니까? (* "메시지에서 소유자를 선택하십시오. = _ AND status ="+ status *). 나는이 시도 할 때

: 당신은 '을 사용하여 객체 필드에 대해 조회 할 수 있습니다

답변

4

사전에

javax.persistence.PersistenceException: 
SELECT FROM Message m WHERE m.owner.username = :ownerID: 
Can only reference properties of a sub-object if the sub-object is embedded. 

감사합니다 .... :

Query query = em.createQuery("SELECT m from Message m " 
+"WHERE m.owner.id = :ownerId"); 

을 나는 follwing을 오류가 발생했습니다. ' 표기법. 예를 들어 "m.owner.id =?"또는 특정 상태의 소유자가있는 메시지에 "m.owner.address.state.id =?"를 물어 특정 소유자와 메시지를 가져올 수 있습니다.

Query q = em.createQuery(" FROM package.Message m WHERE m.owner.id = :ownerId AND m.status = :status") 
      .setParameter("ownerId", user.id) 
      .setParameter("status", status) 
      .getResultList(); 
+0

좋아요,하지만 지금은이 메시지 : "WHERE m.owner.username = 메시지 m 중에서 선택 하위 오브젝트가 포함 된 경우에만 하위 개체의 속성을 참조 할 수 있습니다 : ownerID" –

+0

어떤 종류의 개체의 "username"입니까? – Fil

+0

"username"은 사용자 개체마다 고유 한 문자열입니다. 감사! –

관련 문제