命名查询以根据包含特定值的列表(实例变量)查找所有实体
Named query to find all entities based on list (instance variable) containing certain values
是否可以使用命名查询根据包含特定值的列表查找所有实体。
我有一个名为用户的实体
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 */
}
我将简化 Phone 实体以保持此 post 干净:
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 */
}
现在我需要找到所有拥有 phone 号码的用户,比方说:289647.... 和 Phone.type = 'MOBILE'
Phone 类型是枚举。
我不确定如何使用命名查询实现此目的。通过常规本机查询,我可以使用表上的 JOIN 来完成此操作。有没有人用 NamedQuery
做过这样的事情
首先,您可能混淆了 "named queries" 和 "JPQL" 查询。
JPA 查询可以是 "native" 和 "JPQL" - 区别在于查询语言(SQL 或类似 OQL;第一个是面向记录的,第二个是面向对象)。
两种类型的查询都可以是动态的(内置于 运行time)或静态的(又名 "named",定义为持久性上下文的静态部分,就像实体一样)。后者可以通过创建和存储准备好的查询来表示它们来优化。
加入类似 OQL 的语言(HQL、JPQL)的方式与 SQL 类似,但它们并不表示加入关系(表),而是 - "object attributes"。加入属性时,您无需定义任何条件,因为这些已经是实体定义的一部分。另一方面,加入将为每个实体之间的关联创建一行,因此您可能希望使用 distinct
子句(以避免 User
重复多次,因为匹配的 Phone
出现在 phoneNumbers
名单上)。
大概你想要的是:
select u 来自用户 u left join u.phoneNumbers n where n.type = :type and n.number = :number
上面的查询可以用作命名或未命名的变体,要运行它你必须提供命名参数type
和number
:一个枚举和一个字符串。
是否可以使用命名查询根据包含特定值的列表查找所有实体。
我有一个名为用户的实体
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 */
}
我将简化 Phone 实体以保持此 post 干净:
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 */
}
现在我需要找到所有拥有 phone 号码的用户,比方说:289647.... 和 Phone.type = 'MOBILE'
Phone 类型是枚举。
我不确定如何使用命名查询实现此目的。通过常规本机查询,我可以使用表上的 JOIN 来完成此操作。有没有人用 NamedQuery
做过这样的事情首先,您可能混淆了 "named queries" 和 "JPQL" 查询。
JPA 查询可以是 "native" 和 "JPQL" - 区别在于查询语言(SQL 或类似 OQL;第一个是面向记录的,第二个是面向对象)。
两种类型的查询都可以是动态的(内置于 运行time)或静态的(又名 "named",定义为持久性上下文的静态部分,就像实体一样)。后者可以通过创建和存储准备好的查询来表示它们来优化。
加入类似 OQL 的语言(HQL、JPQL)的方式与 SQL 类似,但它们并不表示加入关系(表),而是 - "object attributes"。加入属性时,您无需定义任何条件,因为这些已经是实体定义的一部分。另一方面,加入将为每个实体之间的关联创建一行,因此您可能希望使用 distinct
子句(以避免 User
重复多次,因为匹配的 Phone
出现在 phoneNumbers
名单上)。
大概你想要的是:
select u 来自用户 u left join u.phoneNumbers n where n.type = :type and n.number = :number
上面的查询可以用作命名或未命名的变体,要运行它你必须提供命名参数type
和number
:一个枚举和一个字符串。