JPA如何使用ManytoOne关系创建Query?

ors*_*har 2 java persistence jpa

基本问题:
如果我有一个实体B,其中ManyToOne字段x链接到另一个实体A,我如何获得在其x字段中具有A的B的所有实例?


更具体地说:
考虑以下内容:

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;
}
Run Code Online (Sandbox Code Playgroud)

我已经准备好了这个查询

Query query = em.createQuery("SELECT m from Message m WHERE m.owner = :us");
Run Code Online (Sandbox Code Playgroud)

这是我想要构建的方法的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");
Run Code Online (Sandbox Code Playgroud)

我得到了以下错误:

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.
Run Code Online (Sandbox Code Playgroud)

提前致谢....

Fil*_*Fil 5

您可以使用"."查询对象字段.符号.例如,您可以通过询问"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();
Run Code Online (Sandbox Code Playgroud)