java - 选择给定元素的所有唯一对 - 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();
解决方案
你可以试试这段代码
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。
推荐阅读
- python - 如何在以另一个列表的一个元素开头的行列表中查找特定行?
- c - 创建后序二叉树数组的函数
- discord - 会员计数频道 discord.py
- pyspark - 我可以在 pyspark forEach 中使用协程函数吗?
- c - 如何在 dsPIC33F 上正确设置 DMA
- python - 'function' 对象不可下标 - 检查其他类似错误但不属于任何其他错误?
- python-3.x - 如果我想将 Google 表格下载到本地 CSV,是否需要为 Google API v4 定义“redirect_uris”?
- java - 是否可以使用 Kafka 将多个任务组合成一个数据条目?
- php - 如何在引导网站中更改下拉框边框半径。(我正在使用 CodeIgniter 框架)
- matlab - 如何禁用一个图中所有子图中的轴?