【发布时间】:2020-10-25 05:32:58
【问题描述】:
我有一个带有skills 属性的User 实体作为类型列表。我想根据技能列表查询User 表,如果技能列中存在所有技能,则除非没有,否则只会找到匹配项。
我为此使用了 JPQL,但它使用 IN 子句一一匹配列表中的每个元素。
用户类
@Entity(name = "App_User")
//table name "user" is not allowed in postgres
public class User {
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
@Column(name = "user_id", updatable = false, nullable = false)
@Setter(AccessLevel.NONE)
private UUID id;
@Column(name = "user_name")
@NotBlank(message = "Name is mandatory")
private String name;
@Column(name = "user_email")
@NotBlank(message = "Email is mandatory")
private String email;
// Current point balance of the user
@Column(name = "points")
private int points;
@ElementCollection(fetch = FetchType.EAGER)
@Column(name = "skills")
@NotEmpty
private List<String> skills = new ArrayList();
}
我使用的 JPA 查询是
SELECT u FROM App_User u JOIN u.skills skill where skill in :skillList
如果我想匹配像Arrays.asList("skill1","skill2","skill3")这样的技能列表,那么我只希望结果中那些拥有所有这些技能的用户,而不是一两个。上面使用的IN 子句返回相同的结果。
我读到无法在 JPQL 中比较两个列表,那么如何使用 CriteriaBuilderCriteriaQueryAPI 来实现这一点?
【问题讨论】:
标签: java spring hibernate jpa spring-data-jpa