2011-01-21 140 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