【问题标题】:grails criteria query return empty resultgrails条件查询返回空结果
【发布时间】:2015-02-26 11:53:51
【问题描述】:

我有一个域结构,如下所示

class Parent {
  static hasMany = [childs:Child]
}

class Child {
 int gender
 string height
}

现在,我想获取所有父母的名单,他们有一个男孩(性别 = 1),身高低于 '180' 厘米并且 一个女孩(性别 = 2),身高超过 ' 150 厘米高。

我尝试了如下给出的标准

def criteria = Parent.createCriteria()
def parents = criteria.list() {
        childs {
            and {
                and {
                    eq("gender", 2)
                    ge("height", 150)
                }
                and {
                    eq("gender", 1)
                    le("height", 180)
                }
            }
        }
    }
}

但它返回一个空列表,尽管有有效数据。

【问题讨论】:

  • 如果height 是您域的String 属性,则不能使用gele 将其作为数字进行比较。这将进行String 比较。
  • @JoshuaMoore 但 srting 比较工作正常.. 即:如果我选择男孩的情况,它工作正常,但查询女孩和男孩都会得到空的结果。
  • 那是因为您的查询正在尝试匹配具有单个子记录的父记录,该记录具有性别 2 和性别 1。永远不会出现这种情况。您需要运行两个查询,一个查找男孩,一个查找女孩,然后获得两者之间的唯一列表。此类问题已在 stackoverflow 上多次提出。
  • @JoshuaMoore 好的,这是解决方案之一,但我还需要在检索整个数据之前检索具有这种情况的父母的数量,因为数据可能有数千个。实际上如何找到计数?
  • @AnIshA,是否可以发布生成查询?

标签: oracle hibernate grails grails-orm


【解决方案1】:

在“孩子”之后将'and' 更改为'or'。因为,逻辑 'or' 试图找到两个查询之间的 联合,该查询始终为空。

List<Parent> parents = Parent.createCriteria().listDistinct {
      and {
          childs {
              or {
                  and {
                      eq("gender", 2)
                      ge("height", 150)
                  }
                  and {
                      eq("gender", 1)
                      le("height", 180)
                  }
              }
          }
      }
  }

您可以查看我所做的 github 项目以说明此答案。

【讨论】:

  • 这个查询不是正确的答案,因为通过使用这个查询我们会得到一个男孩或一个女孩的父母,这不是我们的要求。
  • @AnIshA 检查新答案和 github 项目并将此答案标记为正确。
猜你喜欢
  • 2017-06-15
  • 2021-03-18
  • 2021-11-20
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多