【问题标题】:Is there a 'does not contains' functionality on a collection property of a domain object for createCriteria?createCriteria 的域对象的集合属性上是否有“不包含”功能?
【发布时间】:2014-06-12 09:04:09
【问题描述】:

我有一个类似于this 的问题。但我想要一个不包含的功能。

就像我有一个 Post 域。帖子hasMany 用户。 我想做的事情,使用 createCriteria,是这样的:

def c = Post.createCriteria()
def l = c.list (max: maxVar) {
    notContains("users", thisUser)
}

我尝试使用 ne 但没有运气。

def l = c.list (max: maxVar) {
    users {
        ne('id', thisUser.id)
    }
}

要清楚,我怎样才能得到用户字段是集合不包含 thisUser 的所有帖子的列表?

【问题讨论】:

  • 你使用什么 Grails 版本?
  • 尝试“in”谓词的否定形式,例如not {'in'("age",[18..65])}
  • 我正在使用 grails 2.3.8
  • 我试过not {eq('id', user.id)},没用,结果和ne一样

标签: grails hql createcriteria


【解决方案1】:

您可以为此使用HQL

List<Post> posts = Post.executeQuery("select distinct p from Post p where :myUser not member of p.users", [myUser: user, max: maxVar])

【讨论】:

    【解决方案2】:
    c.list (max: maxVar) { not { 'in'("users", thisUser) }}
    

    将返回一个没有 thisUser 的列表。这适用于 grails 版本 2.*。您可能需要为您的 User 类覆盖 .equals。

    还有许多其他方法,例如使用 .find。请看这个链接http://groovy.codehaus.org/JN1015-Collections

    【讨论】:

    • 添加了@Override public boolean equals(Object obj) { return obj instanceof User &amp;&amp; (id == obj.id) },这个方法给出了错误消息:无法执行查询
    • Post.findAll{usersInterested.find{user}} 给出错误 消息:0
    【解决方案3】:

    我无法获得传统的解决方案,但我使用两个单独的查询解决了这个问题。

    首先,我得到所有 用户 包含 thisUser帖子 使用

    users { eq('id', thisUser.id) }

    然后我得到了最大数量的帖子,其 id 与上面的任何 id 都不匹配。

    Post.findAllByIdNotInList(usersList.id, [max:15])

    usersList 是第一次查询的结果

    附: : 请回答是否有人有更好的解决方案。谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 2017-05-16
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      相关资源
      最近更新 更多