【问题标题】:grails/hibernate criteria how to get all rows that have at least one child meeting conditiongrails/hibernate标准如何获取至少有一个孩子满足条件的所有行
【发布时间】:2017-05-25 09:07:48
【问题描述】:

我的理解是嵌套子查询会过滤子查询。不是父母。换句话说

  Parent.withCriteria{
           children{
               gt('age', 5)
           }

  } 

将返回所有父母,但只返回那些父母超过 5 岁的孩子。

以示例为参考,我想要的是仅获取至少有一个 5 岁以上孩子的父母,并为这些父母获取所有孩子。

我需要这个等价物的查询是...

  SeasonDetails.withCriteria{
            not{
                clubHistory{
                    club{
                        eq('division',division);
                    }
                }
            }
    }

我只获得与特定俱乐部无关的赛季详细信息。

HQL 的工作方式是否不同?也许我需要走那条路

【问题讨论】:

    标签: hibernate grails hibernate-criteria


    【解决方案1】:
    string query="""select new map(p as parent, c as children) from Parent p left join p.children c where c.age > :ageLimit"""
    def inputParams=[:]
    inputParams.ageLimit = 5
    def results = Parent.executeCriteria(query,inputParams)
    result?.each { r ->
       println "${r?.parent?.id} is parent id "
       r?.children?.eachWithIndex { c, i ->
        println "${c.id} ${c.age} is iteration ${i}"
       }
    }
    

    上面应该是 HQL 中的查询来执行您需要的操作,目前它正在返回 map 中的整个对象。这可能很昂贵并导致不必要的查找,(在上面迭代时必须连接并再次获取它)

    您可以做什么,而不是捕获您需要的所有内容并使用 groupBy 来获得您真正需要的内容..

         string query="""select new map(p.name as parentName, p.id as parentId
     , c.id as childId, c.age as childAge, c.name as childName) from Parent p 
    left join p.children c where c.age > :ageLimit"""
    

    如果 id 名称和年龄是您想要的,现在应该返回一个包含所有您需要的平面列表。现在你每个父母都有孩子的数量,所以如果父母 1 有 6 个孩子,它会重复两次(正如你在上面的迭代中看到的)

    你可以使用 groupBy

    def finalList = results.groupBy{it.parentId}
    

    现在这会将上面的列表更改为包含每个子项的每个父组作为列表迭代..

    hql 也有 group by,你可能需要四处看看,看看什么最适合你。

    查询 1 和查询 2 的主要区别是查询 1 在迭代时仍会与数据库交互以返回实际对象。在 query2 中,您将所有结果作为平面迭代返回,并且不再连接到实际的真实数据库对象。如果您启用 SQL 调试,您将看到通过第二种方法进行的工作量减少了多少。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 2021-06-09
      • 2020-06-26
      相关资源
      最近更新 更多