2016-11-28 349 views
0

使用JapRepository - SPring Data JPA,如何处理这种情况:(AnB)U(CnD)操作,其中大括号起着至关重要的作用。在Spring Data JPA中如何实现where谓词的AND和OR

findAllByAAndB() => WHERE A = ? AND B = ? 
findAllByCAndD() => WHERE C = ? AND D = ? 
findAllByXOrY() => WHERE X = ? AND Y = ? 
<How to achieve this clause> => WHERE (A = ? AND B = ?) OR (C = ? AND D = ?) 
+0

JPA通常不支持union [某些提供者可能];你是否以适当的形式尝试了最后一个查询,得到了什么异常,结果不正确,没有结果,查询没有解析等。 –

回答

1

在这种情况下,你可以使用JpaSpecificationExecutor,下面是实现的方式。

  1. 用JpaSpecificationExecutor扩展您的回购。

    public interface EntityRepo extends PagingAndSortingRepository<Entity, String>, JpaSpecificationExecutor<Entity>

  2. 创建规范类和服务类使用的东西,用谓词

    Predicate predicateAnd1 = cb.equal(entity.getA(), entity.getB());

    Predicate predicateAnd2 = cb.equal(entity.getC(), entity.getD());

    Predicate predicateOr = criteriaBuilder.and(predicateAnd1, predicateAnd2);

  3. 然后实现查询像下面

    repo.findAll(entitySpec.getSpec());

以下页面有一个很好的例子。

https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/