JpaSpecificationExecutor:具有规范的复杂查询

时间:2013-01-07 22:03:53

标签: spring spring-data-jpa

我实际上是用不同的过滤器创建研究。

当我使用JpaRepository进行简单查询时,我发现JpaSpecificationExecutor使用Criterias进行动态查询。

我的问题是我需要使用group by和count()创建一个复杂的查询。 对于小组来说没关系,但是我没有找到如何覆盖“选择”部分来放置“计数”指令。

有人可以帮我吗?

我正在使用spring 3.1.2和spring-jpa-data 1.0.3 这是我的代码:

return new Specification< Article >() {

    @Override
    public Predicate toPredicate(final Root<Article> root,
        final CriteriaQuery<?> query, final CriteriaBuilder builder) {
        //count ???
        query.groupBy(root.get(Article_.id));
        Predicate p = builder.and(builder.like(root.<String> get(Article_.title), "%" + title + "%"));

        return p;
    }
}

谢谢!

2 个答案:

答案 0 :(得分:4)

不幸的是,你不能用spring-data规范来做到这一点。

你可以在这里使用spring-data时看到为什么如何这样做(有一个简单的查询只返回一个字段): spring-data specifications - return list of ids instead of objects

要获取字段列表,您可以使用JPA Tuple。你可以在这里找到一个例子: JPA & Criteria API - Select only specific columns

简短版:您需要创建一个使用CriteriaQuery<Tuple>的自定义spring-data存储库。

答案 1 :(得分:1)

如果查看Spring Data的org.springframework.data.jpa.repository.support.SimpleJpaRepository,就会有一个名为getCountQuery(..)的方法。此查询如下所示;

/**
 * Creates a new count query for the given {@link Specification}.
 * 
 * @param spec can be {@literal null}.
 * @return
 */
private TypedQuery<Long> getCountQuery(Specification<T> spec) {

    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<Long> query = builder.createQuery(Long.class);

    Root<T> root = applySpecificationToCriteria(spec, query);
    query.select(builder.count(root));

    return em.createQuery(query);
}

这是在Spring Data JPA的Pageable组件中使用的,可以提供解决方案