簡體   English   中英

如何限制Hibernate僅從Criteria API中涉及多個實體的根實體生成帶有列的SQL查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM