2

私は実際にさまざまなフィルターを使用して研究を作成しています。

JpaRepository を使用して単純なクエリを作成しているため、JpaSpecificationExecutor を使用して Criterias を使用して動的クエリを作成することがわかりました。

私の問題は、group by と count() を使用して複雑なクエリを作成する必要があることです。グループ化は問題ありませんが、「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 をまだ使用しているときにそれを行う理由方法を確認できます (1 つのフィールドのみを返す単純なクエリがあります): spring-data 仕様 - オブジェクトの代わりに ID のリストを返す

フィールドのリストを取得するには、JPA Tuple を使用できます。ここで例を見つけることができます: JPA & Criteria API - 特定の列のみを選択

短いバージョン: を使用するカスタムの 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 に答える