我正在使用带有MySQL数据库的Hibernate 3(我尝试了Hibernate 4,但没有成功)。我已经实现了每个具体类的表继承策略(联合子类)。
它使得除了多态查询之外的工作。Hibernate生成一个基于UNION的查询,其中"where“子句位于高级查询中:
select primKey, param1, param2 from (
select primKey, param1, param2 from Concrete1
union
select primKey, param1, param2 from Concrete2
)
where primKey == <value>
order by param1
limit 100
这会导致非常糟糕的性能,因为加载了整个具体的表内容,而因为pkey是抽象父表的属性,所以"where“子句可以在子选择中定义。
所以我们的目标是让Hibernate生成这样的查询:
select primKey, param1, param2 from (
select primKey, param1, param2 from Concrete1 where primKey == <value>
union
select primKey, param1, param2 from Concrete2 where primKey == <value>
)
order by param1
limit 100
这样,查询就会立即执行。
你知道我如何配置Hibernate来改变这种行为吗?
谢谢
Y.
发布于 2013-05-09 19:31:31
我曾经为类似的性能问题而苦苦挣扎,但我发现唯一的解决方案是(至少在当时)将实现切换到"Table per class hierarchy",这样可以提供更好的性能,因为它不需要联合或联接。它在模式方面不是很简洁,但是如果你只有几个子类,那么它可能是一个很好的选择。
https://stackoverflow.com/questions/11205550
复制