【问题标题】:Select all unique pairs for given element - Criteria API选择给定元素的所有唯一对 - Criteria API
【发布时间】:2020-09-22 18:04:31
【问题描述】:

我有一个带有参数的“会议”实体: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();

【问题讨论】:

  • 请发布Meeting.java 代码输入文档示例。您的帖子中有两个不同的问题 - (1) Spring Data MongoDB 查询和 (2) Java 8 Streams API 使用情况。

标签: java spring mongodb criteria


【解决方案1】:

你可以试试这个代码

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() 但你应该实现 equals 方法 就像在这个例子中 https://www.journaldev.com/31860/java-stream-distinct-function

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 2021-10-11
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    相关资源
    最近更新 更多