use*_*212 5 hibernate jpa union-subclass
我正在使用Hibernate支持TABLE_PER_CLASS继承策略.功能明智,它运作良好.每当发出多态查询时,Hibernate都会为我的两个具体类A和B生成一个包含"union all"的SQL.生成的SQL具有以下格式:
select C1, C2, C3 from (
select C1, C2, C3 from ClassA
union all
select C1, C2, C3 from ClassB
)
where
C1 == <value>
order by C2
limit 100
Run Code Online (Sandbox Code Playgroud)
这种方法的问题在DB端的性能非常差.考虑到C1列是ClassA和ClassB的共享属性(从抽象父类派生)Hibernate可以在两个子选择中插入where子句并显着提高性能.例如,
select C1, C2, C3 from (
select C1, C2, C3 from ClassA where C1 == <value>
union all
select C1, C2, C3 from ClassB where C1 == <value>
)
order by C2
limit 100
Run Code Online (Sandbox Code Playgroud)
也可以在限制上进行一些优化.我在DAO层使用Hibernate标准API.
无法使用Interceptor,onPrepareStatment(),因为参数不可见.在数据库中使用分区和可能的其他选项目前不在范围内,因为我们希望在此阶段的工作中避免DB特定的优化.
知道如何操纵hibernate以提高性能吗?
小智 0
如果您想要较高的跨数据库性能,那么我建议不要使用 table-pr-class 和许多或巨大的多态查询。鉴别器列通常会更好。
请注意,如果您的类层次结构中有两个以上级别,则可以将 table-pr-class 与判别器列组合起来。
| 归档时间: |
|
| 查看次数: |
862 次 |
| 最近记录: |