java - JPA 如何创建具有 ManytoOne 关系的查询?

标签 java jpa persistence

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


更具体地说:
考虑以下实体:

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");

我得到了以下错误:

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.

提前致谢....

最佳答案

您可以使用“.”查询对象字段符号。例如,您可以通过询问“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();

关于java - JPA 如何创建具有 ManytoOne 关系的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4763922/

相关文章:

java - 初级Java Q

grails - 使用关系映射时,Grails通过id获取

java - 在 Hibernate 中将集合中的映射异常另存为成员变量

java - 如何避免以编程方式获取枚举的 bean?

java - 我的程序无法打开第二帧

java - 如何在java中从字符串中剪切单词和字符

hibernate - JBoss 7 Spring JPA + Hibernate 应用程序 : no transaction is in progress

java - 连接多个表时如何使用 JPA Criteria API

hibernate - 在 JPA 中是否可以将继承的属性重新定义为 transient ?

mysql - 如何使用 jpa 将 utf-8 字符正确插入 MySQL 表中