微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在所有情况下,返回所有关联行的createAlias解决方案均无效

如何解决在所有情况下,返回所有关联行的createAlias解决方案均无效

|| 假定以下域对象:
UserChallenge {
  String invitationKind
}

ChallengeGroup {
  UserChallenge challenge
  UserGroup group
}

UserGroup {
  name
}
以下查询通过组关联(部分填充有匹配组)返回质询:
UserChallenge.withCriteria {
  eq(\'invitationKind\',\'GROUP\')
  groups {
    \'in\'(\'group.id\',visibleGroupIds)
  }
}
在帖子http://adhockery.blogspot.com/2009/06/querying-by-association-redux.html中,它建议使用createalias()并修改上面的查询似乎可行:
UserChallenge.withCriteria {
  eq(\'invitationKind\',\'GROUP\')
  createalias(\'groups\',\'g\')
  \'in\'(\'g.group.id\',visibleGroupIds)
}
但是,以下操作无效:
UserChallenge.withCriteria {
  or {
    eq(\'invitationKind\',\'OPEN\')
    and {
      eq(\'invitationKind\',\'GROUP\')
      createalias(\'groups\',\'g\')
      \'in\'(\'g.group.id\',visibleGroupIds)
    }
  }
}
并且仅返回匹配可见组ID的挑战,而不返回\'OPEN \'的挑战。在哪里放置createalias()调用似乎并不重要。 以下工作正常:
UserChallenge.withCriteria {
  or {
    eq(\'invitationKind\',\'GROUP\')
      groups {
        \'in\'(\'group.id\',visibleGroupIds)
      }
    }
  }
}
除了它返回仅具有匹配组的挑战(我正在尝试解决的原始问题)。     

解决方法

尽管问题很老,但是遇到相同问题的任何人都可能会发现它很有用。使用分离标准查询是实现它的又一想法。根据问题中提供的信息,我尝试使用分离的条件查询来完成此任务。请在此处找到有关独立标准的更多信息
def userGroup = new DetachedCriteria(UserGroup).build {
        eq(\"group.id\",visibleGroupIds)
    }
    def getOb = UserChallenge.createCriteria()
    def listReturned = getOb.list {
        or{
            eq(\'invitationKind\',\'OPEN\')
            and {
                eq(\'invitationKind\',\'GROUP\')
                \"groups\" {
                    userGroup
                }
            }
        }
    }``
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。