【问题标题】:Is it possible to add a parameter to hibernate generated query?是否可以向休眠生成的查询添加参数?
【发布时间】:2015-05-29 23:25:38
【问题描述】:

假设我在 DB 中有一个非常大的表“学生”。 student有几列,包括'id'和'class-id'。

在 hbm 文件中,我目前有这样的防御者代码:

<id name="id" column="ID" type="long">
            <generator class="native">
                <param name="sequence">student_ID_SEQ</param>
                <param name="max_lo">999</param>
            </generator>
</id>
<property name="class-id" column="class-id" not-null="true" insert="true" update="true"/>

在这种情况下,如果我更新学生持久类,查询将是:

update .... set .... where ID={id}

但出于分区原因,我还想在查询中包含 class-id,例如:

update .... set .... where ID={id} and class-id={class-id}

我尝试了复合 ID,但注意到复合 ID 中不允许使用生成器,因为复合 ID 通常是基于分配的,而不是基于生成器的。

所以,我只是想知道,是否可以向休眠生成的查询添加参数?

【问题讨论】:

    标签: java database hibernate


    【解决方案1】:

    不,不幸的是在 Hibernate 中没有类似的东西。

    实际上,由于 Hibernate 读取关联实体的方式,很难将数据库分区与 Hibernate 一起使用。假设我们有一个到实体 B 的多对一映射的实体 A。当 Hibernate 读取实体 A 时,它会自动读取实体 B。这取决于获取计划和策略如何以及何时从数据库中准确加载 B,但是在任何情况下,它都是一个不会在 where 子句中包含分区列的查询(如果不使用复合主键)。

    我希望 Hibernate 的未来版本会考虑到这一点。

    但是,您可以查看 Hibernate filters,也许它们可以满足您的分区需求。请记住,尽管在按 id 读取实体时不应用过滤器,这再次意味着读取多对一关联中的实体将不包括分区条件。如果您的数据库支持全局索引,则可以通过使用全局索引来克服这些问题(但它们也有自己的缺陷)。

    此外,根据您使用分区的目的,您可以创建包含分区条件的数据库视图,然后将 Hibernate 实体映射到视图。

    或者,正如您所提到的,我还要说,在其他情况下,这是最直接的方法,您可以使用复合主键并使用您自己的 id 生成器实现(实际上,它应该不难实现一,如果这是您不考虑复合 ID 的唯一原因)。

    【讨论】:

      猜你喜欢
      • 2021-02-13
      • 2016-02-10
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 2019-11-15
      • 2016-08-17
      • 1970-01-01
      • 2017-12-06
      相关资源
      最近更新 更多