首页 > 解决方案 > 选择给定元素的所有唯一对 - Criteria API

问题描述

我有一个带有参数的“会议”实体:meetingId、catId、dogId。可能有很多会议,其中 catId 和 dogId 对是相同的。我需要计算给定猫遇到了多少只狗。换句话说,我需要计算给定猫与不同狗会面的次数。

我怎样才能做到这一点springframework.data.mongodb.core.query.Criteria

public long countUniqueByCatId(String catId) {
            Query query = new Query()
                    .addCriteria(Criteria.where(CAT_ID).is(catId))
                    ....
            return template.count(query, Meeting.class);

同样的问题也适用于流。

meetingsList.entrySet()
                    .stream()
                    .map { it -> it.value }
                    .filter { m -> (m.getCatId() == catId) }
                    ...
                    .count();

标签: javaspringmongodbcriteria

解决方案


你可以试试这段代码

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> query = cb.createQuery(Long.class);
Root<meeting> meetings = query.from(meeting.class);

//here you can change meetings to your new catdogIds class 
cq.select(cb.countDistinct(meetings)).where(Criteria.where(CAT_ID).is(catId));
return entityManager.createQuery(cq).getSingleResult();

对于流,您可以使用 .distinct() 但您应该像本示例 https://www.journaldev.com/31860/java-stream-distinct-function中那样实现 equals 方法

您也可以创建一个包含 catId 和 dogId 的类,然后在覆盖 equals 方法后将结果列表转换为一个集合,以在比较对象具有相同的猫和狗 id 时返回 true。


推荐阅读