spring-data-jpa带括号的复杂查询写法

spring-data-jpa的MAVEN依赖包:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

最后要得到查询效果:

SELECT
	*
FROM
	sys_dictionary sysdiction0_
WHERE
	(
		sysdiction0_.id =?
		OR sysdiction0_.type LIKE ?
	)
      AND keyValue = ?

使用spring-data-jpa构建的代码如下:

 @Override
 public List<SysDictionary> create(DictionaryParam param) {
		Collection<SearchFilter> filters = new ArrayList<>();
        filters.add(new SearchFilter("keyValue",Operator.EQ,param.getName()));
        List<SysDictionary> list= dictionaryDAO.findAll(new Specification<SysDictionary>() {
            @Override
            public Predicate toPredicate(Root<SysDictionary> root,
                                         CriteriaQuery<?> query, CriteriaBuilder builder) {
                //转化
                List<Predicate> orPredicates = Lists.newArrayList();

                Predicate p1 = builder.equal(root.get("id"), param.getId());
                orPredicates.add(builder.or(p1));
                Predicate p2  = builder.like((Path) root.get("type"), "%," + param.getType() + ",%");
                orPredicates.add(builder.or(p2));

                //以下是spring side3提供的方法
                Predicate o = DynamicSpecifications.bySearchFilter(
                                       SysDictionary.class, filters)
                                       .toPredicate(root, query, builder);

                Predicate p = builder.or(orPredicates.toArray(new Predicate[orPredicates.size()]));
                query.where(p, o);
                return null;
            }
        });
     return list;
 }

END

发布了22 篇原创文章 · 获赞 9 · 访问量 7664

猜你喜欢

转载自blog.csdn.net/qq_35719898/article/details/103630769