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查詢到你所需要的,目前它是內地圖返回整個對象。這可能是昂貴的,並導致不必要的查找,(當它迭代上面,它必須連接並再次得到它)
你可以做什麼,而不是捕獲所有你需要的,並使用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"""
現在,如果您希望使用ids名稱和年齡,現在應該返回您需要的所有平面列表。現在你有每單親家庭子女的數量,所以如果父母1有6個孩子被重複兩次(你可以在迭代見上文)
可以使用GROUPBY
def finalList = results.groupBy{it.parentId}
現在,這將改變以上列表到每個父組包含每個孩子作爲列表迭代..
hql也有你的組可能需要玩耍,看看什麼最適合你。
查詢1和查詢2之間的主要區別在於迭代時查詢1仍然會與數據庫交互以返回實際對象。在query2中,您將所有結果作爲平面迭代返回,並且不再連接到實際的實際數據庫對象。如果啓用SQL調試,則會看到通過第二種方法進行的工作量減少了多少。