【发布时间】:2014-10-14 09:52:42
【问题描述】:
我想查找当前用户的所有未查看消息。
一条消息可以供多个用户查看,因此使用布尔值来指示是否查看了一条消息是行不通的。所以一条消息有一个查看者列表。
简化的领域类如下:
class Message {
static hasMany = [ viewees: User ]
String content
}
class User {
String name
}
查找用户查看过的消息很简单:
Message.withCriteria {
viewees {
idEq(currentUser.id)
}
}
所以要查找用户尚未查看的消息,我想我可以像这样添加not{ }:
Message.withCriteria {
viewees {
not {
idEq(currentUser.id)
}
}
}
但这将返回所有查看者不是当前用户的消息。这意味着它将返回另一个用户在被查看者列表中的消息,而不管当前用户是否在被查看者列表中。
除此之外,如果有多个查看者,则返回同一消息的多个实例。
标准构建器还有inList:
not {
inList( propertyName, list )
}
但我需要与此相反。类似的东西:
not {
inList( currentUser.id, 'viewees' )
}
但这不受支持。
有什么我可以使用的类似的东西吗?还是有其他方法可以解决这个问题?也许以某种方式改变领域模型?
【问题讨论】:
-
一种性能不太好的查询方法是
Message.all.findAll { !( currentUser.id in it.viewees*.id ) }。这是执行查询的最坏情况。
标签: hibernate grails grails-orm criteria hibernate-criteria