Spring 查询字符串列表时的条件生成器
我正在从前端传递以下json: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
{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[] {}));
}
};
}