繁体   English   中英

Spring JPA - 如何根据多列返回不同的结果

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM