【发布时间】:2015-12-03 09:52:38
【问题描述】:
我有两个类,分别命名为 A 和 B。B 的主键是 tab_A 的一个字段。映射xml是这样的:
<hibernate-mapping>
<class name="com.fabulous.A" table="tab_A">
<id name="id" column="id">
<generator class="assigned" />
</id>
<property name="userId" column="user_id" />
<many-to-one name="B" column="B_id"
class="com.fabulous.B" unique="true" lazy= "false" cascade="merge">
</many-to-one>
</class>
</hibernate-mapping>
还有另一个映射xml,将类B映射到表B。 我的应用程序中的查询是:
session.createQuery("FROM A WHERE id IN (:ids)").setParameterList("ids", ids).list();
参数是一个A.id的列表。列表大小为100;
lazy=true时查询时间约为1s,但应用A.b时大约需要1分钟。实际上 B 总是需要的,所以 我关闭了延迟加载。查询时间约为40s。
从休眠日志中,休眠从表B一个一个地加载B,而不是批量加载。我认为如果我在查询中从表 A 中提取所有 B.id,然后在批处理中查询表 B,总时间将少于 3 秒。
但这不方便,谁能帮忙弄清楚如何用hibernate改进查询?
非常感谢。
【问题讨论】:
-
为什么不像
FROM A a JOIN FETCH a.B WHERE a.id IN (:ids)那样做一个join fetch -
@ChristianBeikov 我试过这个好像是从hibernate日志工作的,查询是
session.createQuery("FROM A a JOIN FETCH a.b WHERE a.id IN (:ids)").setParameterList("ids", ids).list(),但是我只能从查询中得到一个A,实际上大小应该是100。你知道吗为什么会这样? -
@ChristianBeikov 是标签
<many-to-one>引起的吗? -
也许关系是可选的,那么你需要一个
LEFT JOIN FETCH -
非常感谢 @ChristianBeikov 拯救了我的日子。内部连接会很好,我在大多数 ID 中都丢失了一个字符,现在只有一个有效。
标签: java mysql database hibernate