有一个sql 如下:
select
    *
from
    user
where
    name in (a,b,c)
 or (
        name is null 
        and nicheng in (a,b,c)
 )
这个sql用specification怎么写??

解决方案 »

  1.   

    interface UserRep extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User>代码实现: Specification<User> specification = (Specification<User>) (root, query, criteriaBuilder) -> {
                Predicate conjunction = criteriaBuilder.conjunction();
                //in
                CriteriaBuilder.In<Object> name = criteriaBuilder.in(root.get("name"));
                Arrays.asList("a", "b", "c").forEach(name::in);
                conjunction = criteriaBuilder.and(conjunction, name);            //or
                CriteriaBuilder.In<Object> nicheng = criteriaBuilder.in(root.get("nicheng"));
                Arrays.asList("a", "b", "c").forEach(nicheng::in);
                conjunction = criteriaBuilder.and(conjunction, criteriaBuilder.or(criteriaBuilder.isNull(root.get("name")), nicheng));
                return query.where(conjunction).getRestriction();
            };
            userRep.findAll(specification);未测试,自己可以 debugger 看看参考:https://blog.csdn.net/qq_22161527/article/details/84390418
      

  2.   

    你这连代码都没写对,而且打印出来的sql也是p1 and (p2 or p3)  我要的是 p1 or ( p2 and p3)
      

  3.   

    你这连代码都没写对,而且打印出来的sql也是p1 and (p2 or p3)  我要的是 p1 or ( p2 and p3)