Spring 查询字符串列表时的条件生成器

Spring 查询字符串列表时的条件生成器,spring,spring-boot,hibernate,spring-data-jpa,Spring,Spring Boot,Hibernate,Spring Data Jpa,我正在从前端传递以下json: {names: 'ABC MKL-56-2,ABC MKL-56-3'}; 在服务层,我试图在criteria builder的帮助下在查询中运行,如下所示: public List<APDetails> getWP(String names) { CriteriaBuilder builder = em.getCriteriaBuilder(); CriteriaQuery<APDetails> quer

我正在从前端传递以下json:

{names: 'ABC MKL-56-2,ABC MKL-56-3'};
在服务层,我试图在criteria builder的帮助下在查询中运行
,如下所示:

public List<APDetails> getWP(String names) {
        CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaQuery<APDetails> query = builder.createQuery(APDetails.class);
        Root<APDetails> root = query.from(APDetails.class);
        Predicate hasA = builder.in(root.get(APDetails_.names).in(Arrays.asList(names.split(","))));
        query.where(builder.and(hasA));
        List<APDetails> APs = em.createQuery(query.select(root)).getResultList();
        return APs;
    }

首先,如果您使用的是springboot,我建议您从您的
APDetailsResposition
扩展
JpaSpecificationExecutor
类(请检查,以获取更多信息)(我相信您正在某处使用它们……):

public接口APDetailsRepository扩展了JpaRepository,JpaSpecificationExecutor{
然后,试试这个:

@Autowired
public APDetailsRepository apDetailsRepository;

........

public List<APDetails> getWP(String names) {
    List<String> namesAsList = Arrays.asList(names.split(","));

    List<APDetails> listAPDetails = this.apDetailsRepository.findAll(createSpecification(namesAsList));

    return listAPDetails;
}

 public Specification<APDetails> createSpecification(List<String> names) {
    return new Specification<APDetails>() {
        private static final long serialVersionUID = 1L;

        @Override
        public Predicate toPredicate(Root<APDetails> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
            List<Predicate> predicates = new ArrayList<Predicate>();

            if (names!= null && !names.isEmpty()) {
                List<Predicate> predicatesNames = new ArrayList<Predicate>();

                for (String name : names) {
                    predicatesNames.add(builder.equal(root.<String>get("names"), name));
                    //I believe that the "APDetails_.names" attribute is a String...
                }

                predicates.add(builder.or(predicatesNames.toArray(new Predicate[] {})));        
            }

            return builder.and(predicates.toArray(new Predicate[] {}));
        }
    };
}
@Autowired
公共APDetailsRepository APDetailsRepository;
........
公共列表getWP(字符串名称){
列表名称asList=Arrays.asList(names.split(“,”);
List-listAPDetails=this.apDetailsRepository.findAll(createSpecification(namesAsList));
返回listAPDetails;
}
公共规范createSpecification(列表名称){
返回新规范(){
私有静态最终长serialVersionUID=1L;
@凌驾
公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder){
列表谓词=新的ArrayList();
if(names!=null&&!names.isEmpty()){
列表谓词名称=新的ArrayList();
for(字符串名称:名称){
add(builder.equal(root.get(“name”)、name));
//我相信“APDetails.names”属性是一个字符串。。。
}
add(builder.or(predicatesNames.toArray(newpredicate[]{}));
}
返回builder.and(predicates.toArray(新谓词[]{}));
}
};
}

首先,如果您使用的是springboot,我建议您从您的
APDetailsResposition
扩展
JpaSpecificationExecutor
类(查看,了解更多信息)(我相信您在某处使用了它们……):

public接口APDetailsRepository扩展了JpaRepository,JpaSpecificationExecutor{
然后,试试这个:

@Autowired
public APDetailsRepository apDetailsRepository;

........

public List<APDetails> getWP(String names) {
    List<String> namesAsList = Arrays.asList(names.split(","));

    List<APDetails> listAPDetails = this.apDetailsRepository.findAll(createSpecification(namesAsList));

    return listAPDetails;
}

 public Specification<APDetails> createSpecification(List<String> names) {
    return new Specification<APDetails>() {
        private static final long serialVersionUID = 1L;

        @Override
        public Predicate toPredicate(Root<APDetails> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
            List<Predicate> predicates = new ArrayList<Predicate>();

            if (names!= null && !names.isEmpty()) {
                List<Predicate> predicatesNames = new ArrayList<Predicate>();

                for (String name : names) {
                    predicatesNames.add(builder.equal(root.<String>get("names"), name));
                    //I believe that the "APDetails_.names" attribute is a String...
                }

                predicates.add(builder.or(predicatesNames.toArray(new Predicate[] {})));        
            }

            return builder.and(predicates.toArray(new Predicate[] {}));
        }
    };
}
@Autowired
公共APDetailsRepository APDetailsRepository;
........
公共列表getWP(字符串名称){
列表名称asList=Arrays.asList(names.split(“,”);
List-listAPDetails=this.apDetailsRepository.findAll(createSpecification(namesAsList));
返回listAPDetails;
}
公共规范createSpecification(列表名称){
返回新规范(){
私有静态最终长serialVersionUID=1L;
@凌驾
公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder){
列表谓词=新的ArrayList();
if(names!=null&&!names.isEmpty()){
列表谓词名称=新的ArrayList();
for(字符串名称:名称){
add(builder.equal(root.get(“name”)、name));
//我相信“APDetails.names”属性是一个字符串。。。
}
add(builder.or(predicatesNames.toArray(newpredicate[]{}));
}
返回builder.and(predicates.toArray(新谓词[]{}));
}
};
}

变量的类型是什么
APDetails\uu.names
String
List
?变量的类型是什么
APDetails\uuu.names
String
List
@Autowired
public APDetailsRepository apDetailsRepository;

........

public List<APDetails> getWP(String names) {
    List<String> namesAsList = Arrays.asList(names.split(","));

    List<APDetails> listAPDetails = this.apDetailsRepository.findAll(createSpecification(namesAsList));

    return listAPDetails;
}

 public Specification<APDetails> createSpecification(List<String> names) {
    return new Specification<APDetails>() {
        private static final long serialVersionUID = 1L;

        @Override
        public Predicate toPredicate(Root<APDetails> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
            List<Predicate> predicates = new ArrayList<Predicate>();

            if (names!= null && !names.isEmpty()) {
                List<Predicate> predicatesNames = new ArrayList<Predicate>();

                for (String name : names) {
                    predicatesNames.add(builder.equal(root.<String>get("names"), name));
                    //I believe that the "APDetails_.names" attribute is a String...
                }

                predicates.add(builder.or(predicatesNames.toArray(new Predicate[] {})));        
            }

            return builder.and(predicates.toArray(new Predicate[] {}));
        }
    };
}