私は同じ問題に遭遇したので、それが誰かを助ける場合に備えて、これが私がしたことです:
仕様は 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);
}
applySpecificationToCriteria
SimpleJpaRepository
クラスにいます。
これでメソッドを使用できますfindDistinctValues
。