【问题标题】:How to improve the hibernate query?如何改进休眠查询?
【发布时间】: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 是标签&lt;many-to-one&gt;引起的吗?
  • 也许关系是可选的,那么你需要一个LEFT JOIN FETCH
  • 非常感谢 @ChristianBeikov 拯救了我的日子。内部连接会很好,我在大多数 ID 中都丢失了一个字符,现在只有一个有效。

标签: java mysql database hibernate


【解决方案1】:

要急切地为查询获取一些关系,只需执行简单的JOIN FETCHLEFT JOIN FETCH(如果关系是可选的,例如

FROM A a JOIN FETCH a.B WHERE a.id IN (:ids)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-09
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多