假设我在DB中有一个表'student'非常大。 学生中有几列,包括'id'和'class-id'。
在hbm文件中,我目前有这样的defenter代码:
<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}
我尝试使用composite-id,但是在composite-id中不允许使用生成器,因为composite-id通常是基于赋值的,而不是基于生成器的。
所以,我只是想知道,是否可以为hibernate生成的查询添加参数?
答案 0 :(得分:1)
不,不幸的是,在Hibernate中没有类似的东西。
实际上,由于Hibernate读取关联实体的方式,很难将数据库分区与Hibernate一起使用。让我们说实体A与实体B有多对一的映射。当Hibernate读取实体A时,它会自动读取实体B.它取决于获取计划和策略B是如何以及何时完全加载的来自数据库,但无论如何它是一个不包含where子句中的分区列的查询(如果不使用复合主键)。
我希望未来的Hibernate版本能够考虑到这一点。
但是,你可以看看Hibernate filters,也许它们对你的分区需求很有用。请记住,虽然在按ID读取实体时不应用过滤器,这意味着多对一关联中的读取实体不会包含分区条件。如果您的数据库支持全局索引(但它们有自己的陷阱),可以通过使用全局索引来克服这个问题。
此外,根据您使用分区的内容,您可以创建包含分区条件的数据库视图,然后将Hibernate实体映射到视图。
或者,正如您所提到的,我也会说这是其他情况下最直接的方法,您可以使用复合主键并使用您自己的id生成器实现(实际上,它应该不难实现一,如果这是你不考虑复合ID的唯一理由。)