Java JPA规范添加Where IN子句
我想问一下如何为具有List属性的类使用JPA规范。假设有一个用户可以同时扮演多个角色。我想从DB中获取所有用户,其中角色列表和用户ID列表是给定的Java JPA规范添加Where IN子句,java,spring-data-jpa,Java,Spring Data Jpa,我想问一下如何为具有List属性的类使用JPA规范。假设有一个用户可以同时扮演多个角色。我想从DB中获取所有用户,其中角色列表和用户ID列表是给定的 @Entity(name = "UserEntity") public class User { Private Long id; private String name; private String surname; @ManyToMany(fetch = FetchType.LAZY)
@Entity(name = "UserEntity")
public class User {
Private Long id;
private String name;
private String surname;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "OA_USER_ROLE_DTL", joinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "ID"), inverseJoinColumns = @JoinColumn(name = "ROLE_ID", referencedColumnName = "ID"))
@OrderBy
@JsonIgnore
private Collection<Role> roles;
}
@Entity(name=“UserEntity”)
公共类用户{
私人长id;
私有字符串名称;
私家姓;
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name=“OA\u USER\u ROLE\u DTL”,joinColumns=@JoinColumn(name=“USER\u ID”,referencedColumnName=“ID”),inverseJoinColumns=@JoinColumn(name=“ROLE\u ID”,referencedColumnName=“ID”))
@订货人
@杰索尼奥雷
私人收藏角色;
}
回答我的问题
public class UserSpecification implements Specification<UserEntity> {
private Set<String> roleNames;
private Set<Long> userId;
private Date startDate;
private Date endDate;
private String emailId;
private String userName;
private String mobileNo;
private Long clientId;
@Override
public Predicate toPredicate(Root<UserEntity> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
List<Predicate> finalPredicate = new ArrayList<Predicate>();
if (roleNames != null && !roleNames.isEmpty()) {
Join<UserEntity, Role> userRoleJoin = root.join(ROLES);
Predicate roleName = userRoleJoin.get(ROLE_NAME).in(roleNames);
finalPredicate.add(roleName);
}
if (userId != null && !userId.isEmpty()) {
Predicate userIdPredicate = root.get(ID).in(userId);
finalPredicate.add(userIdPredicate);
}
if (!StringUtils.isEmpty(emailId)) {
finalPredicate.add(criteriaBuilder.equal(root.get(EMAIL_ID), emailId));
}
if (!StringUtils.isEmpty(userName)) {
finalPredicate.add(criteriaBuilder.equal(root.get(USERNAME), userName));
}
if (!StringUtils.isEmpty(mobileNo)) {
finalPredicate.add(criteriaBuilder.equal(root.get(MOBILE_NUM), mobileNo));
}
if(clientId!=null && clientId!=0L) {
finalPredicate.add(criteriaBuilder.equal(root.get(CLIENT_ID), clientId));
}
if (startDate != null && endDate != null) {
Path<Date> path = root.get(CREATED_DATE);
finalPredicate.add(criteriaBuilder.between(path, startDate, endDate));
}
query.distinct(true);
Predicate and = criteriaBuilder.and(finalPredicate.toArray(new Predicate[finalPredicate.size()]));
return and;
}
}
公共类UserSpecification实现规范{
私设角色扮演;
私有设置用户标识;
私人日期开始日期;
私人日期结束日期;
私有字符串emailId;
私有字符串用户名;
私有字符串mobileNo;
私人长客户;
@凌驾
公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder CriteriaBuilder){
List finalPredicate=new ArrayList();
if(roleNames!=null&&!roleNames.isEmpty()){
Join userRoleJoin=root.Join(角色);
谓词roleName=userRoleJoin.get(角色名称).in(角色名称);
最终预测添加(roleName);
}
if(userId!=null&&!userId.isEmpty()){
谓词userIdPredicate=root.get(ID).in(userId);
finalPredicate.add(userIdPredicate);
}
如果(!StringUtils.isEmpty(emailId)){
finalPredicate.add(criteriaBuilder.equal(root.get(EMAIL_ID),emailId));
}
如果(!StringUtils.isEmpty(用户名)){
finalPredicate.add(criteriaBuilder.equal(root.get(USERNAME),USERNAME));
}
如果(!StringUtils.isEmpty(mobileNo)){
finalPredicate.add(criteriaBuilder.equal(root.get(MOBILE_NUM),mobileNo));
}
如果(clientId!=null&&clientId!=0L){
finalPredicate.add(criteriaBuilder.equal(root.get(CLIENT_ID),clientId));
}
if(startDate!=null&&endDate!=null){
Path Path=root.get(创建日期);
finalPredicate.add(criteriaBuilder.between(path,startDate,endDate));
}
query.distinct(true);
谓词and=criteriaBuilder.and(finalPredicate.toArray(新谓词[finalPredicate.size());
返回和返回;
}
}
您是否尝试过列出findallbydinandrolesidin(列出用户ID,列出角色ID)代码>?我试过了,但没有为我工作。你得到了什么错误/结果?您可以在这里添加存储库代码吗?使用规范界面完成