是否可以在hibernate生成的查询中添加参数?
假设我在DB中有一个表’student’非常大。 学生中有几列,包括’id’和’class-id’。
在hbm文件中,我目前有这样的defenter代码:
student_ID_SEQ 999
在这种情况下,如果我更新学生持久化课程,查询将如下:
update .... set .... where ID={id}
但是出于分区原因,我想在查询中包含class-id,如:
update .... set .... where ID={id} and class-id={class-id}
我尝试使用composite-id,但是在composite-id中不允许使用生成器,因为composite-id通常是基于赋值的,而不是基于生成器的。
所以,我只是想知道,是否有可能为hibernate生成的查询添加参数?
不,不幸的是在Hibernate中没有类似的东西。
实际上,由于Hibernate读取关联实体的方式,很难将数据库分区与Hibernate一起使用。 假设我们有实体A与实体B的多对一映射。当Hibernate读取实体A时,它将自动读取实体B.它取决于获取计划和策略B是如何以及何时从数据库中精确加载的,但是在任何情况下,它都是一个不包含where子句中的分区列的查询(如果不使用复合主键)。
我希望Hibernate的未来版本能够考虑到这一点。
但是,您可以查看Hibernate filter ,它们可能对您的分区需求很有用。 请记住,虽然在按ID读取实体时不应用filter,这意味着多对一关联中的读取实体将不包含分区条件。 如果您的数据库支持全局索引(但它们有自己的缺陷),可以通过使用全局索引来解决这个问题。
此外,根据您使用分区的内容,您可以创建包含分区条件的数据库视图,然后将Hibernate实体映射到视图。
或者,正如您所提到的,我也会说这是其他情况下最直接的方法,您可以使用复合主键并使用您自己的id生成器实现(实际上,实现一个,如果实现的话,应该不难)这是你不考虑复合ids的唯一理由。
- 以编程方式使用动态用户名和密码配置Hibernate
- 永远不会调用Hibernate @PostLoad
- JPA 2.1:Java 8日期/时间API简介
- 加载spring-boot和spring-data-jpa时,Hibernate无法加载JPA 2.1 Converter
- 使用可滚动结果集在hibernate中批量读取数据
- 在hibernate createSQlquery结果中使用sql列名
- 从@ OneToMany-association中删除子项:CascadeType.ALL + orphanRemoval = true not working
- Hibernate – 有没有办法将2列与1连接?
- java.lang.IllegalStateException:具有@ManyToMany 3实体的同一实体的多个表示forms