【发布时间】:2012-09-28 17:19:16
【问题描述】:
我有两个实体,Item 和 Data,还有一个 DTO 类 ItemData。 ItemData 由 Item 和 Data 组成,没有 JPA 映射。为了检索填充的 ItemDatas 列表,我在 JPQL 中使用了构造函数表达式:
select new my.package.ItemData(i, d)
from Item i, Data d
where i.id = d.itemId
这就是 Hibernate 正在做的事情:它不是同时获取 Item 和 Data 的数据,而是先获取它们的 ID,然后在 n 单独的选择语句中获取数据。有没有办法改变这种行为?
Hibernate:
select
item0_.id as col_0_0_,
data1_.id as col_1_0_
from
ITEM item0_,
DATA data1_
Hibernate:
select
item0_.no as no1_0_,
item0_.description as description1_0_,
item0_.organic as bio1_0_,
item0_.gluten as gluten1_0_,
item0_.laktose as laktose1_0_
from
ITEM item0_
where
item0_.id=?
Hibernate:
select
data0_.amount as amount1_3_0_,
data0_.avg as avg3_0_,
data0_.total as total3_0_
from
DATA data0_
where
data0_.id=?
Hibernate:
select
item0_.no as no1_0_,
item0_.description as description1_0_,
item0_.organic as bio1_0_,
item0_.gluten as gluten1_0_,
item0_.laktose as laktose1_0_
from
ITEM item0_
where
item0_.id=?
Hibernate:
select
data0_.amount as amount1_3_0_,
data0_.avg as avg3_0_,
data0_.total as total3_0_
from
DATA data0_
where
data0_.id=?
...and so on...
【问题讨论】:
-
@DataNucleus 为什么要删除 JPA 标签?
-
仅仅是因为您将问题中的所有内容都表达为特定于休眠的(休眠 SQL 等)。具有 JPA 一般背景的人无法在其中为您提供任何帮助......它的 Hibernate 特定
-
我不同意。有一些 JPQL 表达式会影响提供者的行为(例如,“join fetch”)。
-
您需要将 Item 和 Data 映射为 OneToMany 语句,以便 Hibernate 知道有一个 Set 结构在起作用。然后将自动生成连接。
-
为什么投反对票?我愿意改进...
标签: java hibernate jpa select-n-plus-1