2011-01-21 138 views
2

基本問題:
如果我有一個實體B,並且ManyToOne字段x鏈接到另一個實體A,那麼如何獲得在其x字段中有A的B的所有實例?
JPA如何使用ManytoOne關係創建查詢?


更具體地說:
考慮下面的entites:

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; 
} 

我已經有了這個查詢準備

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

這裏是因爲我想建一個方法的API:
輸入:用戶u,狀態s
輸出:擁有者u和狀態s的所有消息的列表。

我知道我應該使用EntityMenager構建查詢,但什麼是正確的語法?我在零件中放置了什麼(*「SELECT m FROM Message m WHERE owner = _ AND status =」+ status *)。

當我嘗試這樣做:

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

我得到了follwing錯誤:

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. 

在此先感謝....

回答

4

您可以查詢反對使用」對象字段。 「符號。例如,通過詢問「m.owner.address.state.id =?」,您可以通過要求「m.owner.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

大,但現在我得到這個消息:從「選擇消息m WHERE m.owner.username =:OWNERID:如果子嵌入對象只能引用一個子對象的屬性」 – 2011-01-23 20:50:53