2017-01-10 52 views
0

我的理解是嵌套的子查詢過濾子級。不是父母。換句話說grails/hibernate條件如何獲得至少有一個子會議條件的所有行

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

    } 

將返回所有的父母,但只有那些超過5

使用的例子作爲參考父母的孩子,我要的是隻得到至少擁有父母一個5歲以上的孩子,併爲這些父母獲得所有孩子。

,我需要這個等價物是查詢...

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

這裏我只得到未鏈接到某個俱樂部本賽季的詳細信息。

HQL的工作方式不同嗎?也許我需要走這條路,而不是

回答

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查詢到你所需要的,目前它是內地圖返回整個對象。這可能是昂貴的,並導致不必要的查找,(當它迭代上面,它必須連接並再次得到它)

你可以做什麼,而不是捕獲所有你需要的,並使用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調試,則會看到通過第二種方法進行的工作量減少了多少。

相關問題