2011-01-21 12 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"は、ユーザーエンティティオブジェクトごとに一意のStringです。ありがとう! –

関連する問題