2

我实际上正在使用不同的过滤器进行研究。

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

我的问题是我需要使用 group by 和 count() 创建一个复杂的查询。group by 没问题,但我不知道如何覆盖“select”部分来放置“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;
    }
}

谢谢 !

4

2 回答 2

5

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

您可以在这里看到为什么以及如何在仍然使用 spring-data 时执行此操作(有一个仅返回一个字段的简单查询): spring-data 规范 - 返回 id 列表而不是对象

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

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

于 2013-01-09T09:49:27.387 回答
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 组件中使用,并可能提供解决方案

于 2013-01-08T02:16:12.723 回答