[英]Spring Data JPA Distinct - Return results from a single column
[英]Spring JPA - How to return distinct results based on multiple columns
我有一张看起来有点像这样的桌子
实体名称 | 年 | 人名 |
---|---|---|
学校 1 | 2021 | 人 1 |
学校 1 | 2021 | 人 2 |
学校 1 | 2020 | 人 1 |
学校 2 | 2021 | 人 1 |
我希望能够使用 Spring JPA 每个实体名称只返回一个结果。 例如,结果将是 School 1,School 2。我不在乎检索的是 School 1 的哪一行,我只需要检索一个。 我需要能够使用规范、返回分页结果并对结果进行排序。
这是我到目前为止尝试过的
存储库
@Repository
public interface Repository extends JpaRepository<Model, UUID>,
JpaSpecificationExecutor<Model>{
}
服务
repository.findAll(Specification
.searchByDtoSpec(searchDto), page)
.map(this::mapToDto);
规格
public static Specification<Model> searchByDtoSpec(
final SearchDto searchDto) {
return (root, query, cb) -> {
final List<Predicate> predicates = new ArrayList<>();
query.multiselect(root.get("entityName"),root.get("personName")).distinct(true);
return cb.and(predicates.toArray(Predicate[]::new));
};
}
为了回答我自己的问题,我无法找到不使用 CriteriaBuilder 和 CriteriaQuery 的方法。 我不得不将 CriteriaQuery 多选和 CriteriaQuery distinct 结合起来 这是我的代码片段,可以帮助遇到我的情况的其他人:
public Page<Model> findAllByFilters(final Pageable page,
final SearchDto searchDto) {
final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<Model> cq = cb.createQuery(Model.class);
final Root<Model> root = cq.from(Model.class);
final List<Predicate> predicates = getCustomPredicates(root, cq, cb, searchDto,
currentDate, false);
cq.where(predicates.toArray(Predicate[]::new));
cq.multiselect(root.get("entityName"), root.get("year"), root.get("personName");
cq.distinct(true);
final TypedQuery<Model> tq = em.createQuery(cq);
// Code for Pagination
...
final List<Model> list = tq.getResultList();
return new PageImpl<Model>(list, page, count);
}
在您的Repository
界面中添加这样的方法
Model findFirstByOrderByPersonNameAsc();
你可以随心所欲地订购它。 如果你愿意,你也可以返回一个可选的Optional<Model>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.