13

select distinct a.address from Person a(address は Person 内の Address エンティティです) 種類のクエリ を作成する必要がある状況があります。

仕様を使用して where 句を動的に構築し、findAll(Specification<T>)関数を使用して結果を取得しています。問題は、仕様を使用して select 句を作成できないため、findAll(Spcification)関数を使用できないことです。

このようなことをする最善の方法は何でしょうか?

4

5 に答える 5

6

私は同じ問題に遭遇したので、それが誰かを助ける場合に備えて、これが私がしたことです:

仕様は where 句に変換されており、findAll(Specification<T>)関数は独自の select 句を作成しています。したがって、何らかの方法で関数を使用してこれを修正する方法はありませんfindAll(Specification<T>)。を拡張するカスタム リポジトリが既にあるSimpleJpaRepositoryので、新しいメソッドを追加しました。

@Override
    @Transactional(readOnly = true)
    public List<Object> findDistinctValues(Specifications<T> spec, String columnName) {
        return getQuery(spec, columnName).getResultList();
    }

    protected TypedQuery<Object> getQuery(Specification<T> spec, final String distinctColumnName) {

        CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaQuery<Object> query = builder.createQuery(Object.class);
        Root<T> root = applySpecificationToCriteria(spec, query);

        if (null != distinctColumnName) {
            query.distinct(true);
            query.multiselect(root.get(distinctColumnName));
        }

        // We order by the distinct column, Asc
        query.orderBy(builder.asc(root.get(distinctColumnName)));

        return em.createQuery(query);
    }

applySpecificationToCriteriaSimpleJpaRepositoryクラスにいます。

これでメソッドを使用できますfindDistinctValues

于 2015-01-06T14:35:13.707 に答える
4

良い!特定の列に対してもdistinct使用できます。JPQLそれはもうここにあります。JPA で DISTINCT を使用するリファレンス

于 2012-10-18T07:57:21.870 に答える
3

迅速かつ汚い解決策は、次を使用して結果をフィルタリングすることSetです。

Set<...> set = new HashSet<...>( findAll( ... ) )

equals()と がドメインクラスに適切に実装されていることを確認してhashCode()ください:-)

乾杯、

于 2012-10-18T07:37:40.290 に答える
-2

これは機能しますか?

List<Person> findDistinctPeopleByAddress(String lastname, String firstname);

その後、リストを反復処理して Person.getAddress() を使用しますか?

于 2015-06-01T14:29:04.307 に答える