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

Posted

技术标签:

【中文标题】命名查询根据包含某些值的列表(实例变量)查找所有实体【英文标题】:Named query to find all entities based on list (instance variable) containing certain values 【发布时间】:2017-09-24 21:04:39 【问题描述】:

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

我有一个名为用户的实体

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'

电话类型是枚举。

我不确定如何使用命名查询来实现这一点。通过常规的本机查询,我可以在表上使用 JOIN 来完成这项工作。有没有人用 NamedQuery 做过类似的事情

【问题讨论】:

【参考方案1】:

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

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

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

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

可能你想要的是:

select u from User u left join u.phoneNumbers n where n.type = :type and n.number = :number

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

【讨论】:

这清除了很多东西。非常感谢。我的印象是,在命名查询中我不会使用任何连接,只需输入对象属性,就有一种方法可以获得我想要的结果。非常感谢。感谢您的帮助。

以上是关于命名查询根据包含某些值的列表(实例变量)查找所有实体的主要内容,如果未能解决你的问题,请参考以下文章

python中怎样查看已加载的命名空间中所有变量和函数

Impala 查询:在管道分隔列表中查找值

包含列表中所有值的 Django 反向查询集

sql查询字段中所有等于某些值的数据

Grails 命名查询 - 按关联查找

如何在mongodb中获取包含某些(字符串)值的集合的所有键