[英]How to restrict Hibernate to generate SQL query with columns only from root entity in Criteria API involving multiple entities
我已經使用包含多個實體的標准API編寫了休眠代碼(具有父子關系,並且我正在使用createAlias()來連接實體),期望僅在結果中獲取根實體。
但是,當我調試由hibernate生成的SQL時,我發現hibernate正在為join子句(通過createAlias()實現)中使用的所有實體獲取數據(在select子句中)。
我認為除了預期的根實體以外,沒有必要獲取其他實體的列,因為它可能效率不高,我想避免這種情況?
我正在使用Hibernate 3.6.9版本
這是場景。 有3個具有父子關系的實體A,B和C按照以下方式A(超級父)-> B(父)-> C(子)
session.createCriteria(B.class, "b")
.createAlias("b.c", "c",Criteria.INNER_JOIN)
.createAlias("b.a", "a",Criteria.INNER_JOIN)
.add(Restrictions.in("c.prop1c", <<some value>>))
.add(Restrictions.in("a.prop1a", <<some value>>))
criteria.list()
now when hibernate generates the SQL it looks like
select
b.all columns of B
a.all columns of A
c.all columns of C
from B b
inner join A a on b.prop=a.prop
inner join C C on b.prop=c.prop
where
c.prop1c = <<some value>>
a.prop1a = <<some value>>
如果您觀察到休眠狀態已生成查詢以獲取所有實體(A,B和C)的所有列,但是截至目前,我不需要除根實體(B)之外的任何實體,應獲取諸如A&C之類的實體的數據后來按照它們到B的映射上的提取策略進行操作。我認為無需為此查詢通過n / w流量獲取所有數據,但休眠仍會像這樣生成查詢。
有沒有一種方法可以引導冬眠只使用條件API來獲取實體B的列,而不能獲取A&C的列?
select
b.all columns of B
from B b
inner join A a on b.prop=a.prop
inner join C C on b.prop=c.prop
where
c.prop1c = <<some value>>
a.prop1a = <<some value>>
遺留條件已棄用。 您可以通過JOIN指令(而不是FETCH)使用支持此功能的JPA標准。
或者,使用JPQL:
select b
from B b
inner join b.a. a
inner join b.a. c
where
c.prop1c = :prop1c
a.prop1a = :prop1a
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.