Java JPA规范添加Where IN子句

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)

我想问一下如何为具有List属性的类使用JPA规范。假设有一个用户可以同时扮演多个角色。我想从DB中获取所有用户,其中角色列表和用户ID列表是给定的

@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)?我试过了,但没有为我工作。你得到了什么错误/结果?您可以在这里添加存储库代码吗?使用规范界面完成