java - 命名查询根据包含某些值的列表(实例变量)查找所有实体

标签 java hibernate jpa named-query

是否可以使用命名查询根据包含特定值的列表查找所有实体。

我有一个名为 User 的实体

public class User implements Serializable {

    private static final long serialVersionUID = -82485348776234092345L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @NotNull
    @Size(min = 5, max = 50)
    @Column(name = "email")
    private String email;
    @NotNull
    @Size(min = 5, max = 50)
    @Column(name = "password")
    private String password;
    @Column(name = "creationDate")
    @Temporal(TemporalType.TIMESTAMP)
    private Date creationDate;
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "user", cascade = CascadeType.ALL)
    private List<Phone> phoneNumbers;


    /* Getters and Setters */
}

我将简化电话实体以保持这篇文章的简洁:

public class Phone implements Serializable {

    private static final long serialVersionUID = -34672347534985L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @NotNull
    @Column(name = "number")
    private String number;
    @Column(name = "type")
    @Enumerated(EnumType.STRING)
    private EPhoneType phoneType;
    @Column(name = "creationDate")
    @Temporal(TemporalType.TIMESTAMP)
    private Date creationDate;
    @ManyToOne
    private User user;


    /* Getters and Setters */

}

现在我需要找到所有拥有该电话号码的用户,比如说:289647....并且Phone.type = 'MOBILE'

电话类型是一个枚举。

我不知道如何使用命名查询来实现这一点。通过常规 native 查询,我可以使用表上的 JOIN 来完成此操作。有没有人用 NamedQuery 做过类似的事情

最佳答案

首先,您可能会将“命名查询”与“JPQL”查询混淆。

JPA 查询可以是“ native ”和“JPQL” - 区别在于查询语言(SQL 或类似 OQL;第一个是面向记录的,第二个是面向对象的)。

两种类型的查询都可以是动态的(在运行时构建)或静态的(又名“命名”,定义为持久性上下文的静态部分,就像实体一样)。后者可以通过创建和存储准备好的查询来表示它们来优化。

类似 OQL 的语言(HQL、JPQL)中的连接方式与 SQL 中类似,但它们并不代表连接关系(表),而是代表“对象属性”。连接属性时,您无需定义任何条件,因为这些条件已经是实体定义的一部分。另一方面,连接将为实体之间的每个关联创建一行,因此您可能需要使用 distinct 子句(以避免 User 重复多次,作为匹配电话出现在phoneNumbers列表中)。

您想要的可能是:

从用户中选择 u u 左加入 u.phoneNumbers n,其中 n.type = :type 且 n.number = :number

上面的查询可以用作命名或未命名的变体,要运行它,您必须提供命名参数typenumber:一个枚举和一个字符串。

关于java - 命名查询根据包含某些值的列表(实例变量)查找所有实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46394839/

相关文章:

java - Intellij Idea NoClassDefFoundError : com/intellij/util/messages/Topic

java - 在数组列表中将特定单词连接在一起

java - hibernate 上的触发器(也许这称为拦截器)

java - getEntityManager.persist(object) 之后如何提交和回滚数据

java - 在不同包中具有相同名称的两个实体

hibernate - JPQL选择具有最大值的记录

java - Corba - 服务器端方法可能吗?

java - 使用Java读取文件时检测空行

java - 在 IntelliJ IDEA 15.0.3 中运行 Hibernate 项目时出错

java - Hibernate 中 select Double 的问题