我有一个带有参数的“会议”实体: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(),但应实现equals方法像这个例子https://www.journaldev.com/31860/java-stream-distinct-function
您还可以创建一个包含catId和dogId的类,然后在覆盖equals方法之后将结果列表转换为一个集合,以在比较对象具有相同的cat和dog id时返回true。