我正在使用 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
这种方法的问题在于数据库端的性能非常差。考虑到 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
也可以在极限上做一些优化。我在我的 DAO 层中使用 Hibernate 标准 API。
拦截器,onPrepareStatment() 无法使用,因为参数不可见。在数据库上使用分区和可能的其他选项目前超出了范围,因为我们希望在此工作阶段避免特定于数据库的优化。
知道如何操纵休眠以提高性能吗?