【发布时间】:2023-03-31 04:42:01
【问题描述】:
我在这样的层次结构中有 3 个实体:
MyInterface
|
-----------------
| |
Entity1 Entity2
MyInterface 没有在 Hibernate 中映射(因为我使用 implicit polymorphism strategy 来映射这个继承)
事实上,如果我启动这样的查询:
"FROM MyInterface"
它工作得很好(因为它检索了 Entity1 的所有实例和 Entity2 的所有实例,将它们放在一起,然后返回一个List<MyInterface>)。
如果我们看一下 Hibernate 生成的 SQL,它会启动 2 个独立的 SQL 查询来首先检索 Entity1 实例,然后另一个查询来检索 Entity2 实例,但我对此很好。
当您尝试执行以下操作时,就会出现大问题:
"FROM MyInterface ORDER BY someField"
因为它将 ORDER BY 应用于第一个 SQL 查询,然后将相同的 ORDER BY 应用于第二个 SQL 查询,而不是将它们应用于 WHOLE 查询(我知道这一点,因为我可以看到Hibernate 启动的本机 SQL 查询)。
这显然是 Hibernate 的错误行为。
如何解决这个问题以强制 Hibernate 将 ORDER BY 应用于整个查询? (我不能在内存中这样做,因为稍后我还必须添加分页)。
【问题讨论】:
-
你能提供你正在使用的映射吗?
-
我将实体映射为独立实体(没什么特别的),我只是在 Java 级别(而不是在 Hibernate 中)使它们成为 MyInterface 的实现者。这是一个艰难的简化,所以我没有得到实体的映射 XML,但映射与任何其他常规实体相同,只是实现了一个通用的 MyInterface,没有别的。
-
好吧,尝试编写一个 SQL 查询,从两个不同的表中进行选择并按一个公共字段排序。恕我直言,这是不可能的,因此 hibernate 也不能这样做。
-
UNION 给你一些空间。无论如何,Hibernate 为 HQL 的含义定义了一个语义,由于底层技术的限制,它没有实现这些语义。恕我直言,Hibernate 应该尽可能使用 SQL 来克服这个限制,即在内存中进行计算以维护语言的语义。
-
我认为在
someField构建集合时在休眠状态下进行合并会很便宜。