为啥 hibernate 在不同的 JVM 实例中为相同的查询创建不同的列别名?

Posted

技术标签:

【中文标题】为啥 hibernate 在不同的 JVM 实例中为相同的查询创建不同的列别名?【英文标题】:Why does hibernate create different column aliases for same query in different JVM instances?为什么 hibernate 在不同的 JVM 实例中为相同的查询创建不同的列别名? 【发布时间】:2016-12-19 00:43:12 【问题描述】:

当我在我的 Java 应用程序中监视由 hibernate 生成的 SQL 查询时,查询中使用的每一列都有列别名。但是对于不同的 JVM 实例,列别名后缀不同的数字。

例如:

select user0.ID as ID1_276_,
user0.DESCRIPTOR_ID as DESCRIPTOR10_276_,
user0.USER_ID as USER11_276_ 
from CI_USER user0
where ...

但当应用重新启动时,列别名中的后缀会不断变化。我不确定这些后缀的确切逻辑或公式是什么,即_276_。有时,相同的查询会显示如下内容:

select user0.ID as ID1_144_,
user0.DESCRIPTOR_ID as DESCRIPTOR10_144_,
user0.USER_ID as USER11_144_ 
from CI_USER user0
where ...

只有列别名不断变化。表别名保持不变。有人可以帮忙指出hibernate是如何在后缀中产生这些数字的吗?另外,我可以完全停止这些后缀吗?我想要没有列别名或具有相同列别名的查询。

Oracle 中不同列别名导致的副作用之一是无法使用相同的 SQL 解释计划,因为它被锁定到特定查询。

【问题讨论】:

您可能希望将此问题的标题更改为更好的名称。问题的实质是它会导致 Oracle 出现问题,但您只是在最后提到它。 @Kayaman - 我无法编辑问题。但是,是的,这是质疑的主要原因。动态查询的副作用是中断锁定的 sql 计划。如果有办法覆盖列别名,那就是我正在寻找的。​​span> 【参考方案1】:

我认为这是 Oracle 的错误。别名不会改变查询!

我们的解决方案在 persistence.xml 中

<exclude-unlisted-classes>true</exclude-unlisted-classes>

所以 hibernate 在重启后给出相同的别名!

通过开发下一个应用程序版本:您必须在 persistence.xml 中保持实体顺序。如果在现有的 'B' 之前插入 'A' 实体,则 B 和 B 的 column-s 别名将不同。

有人有更好的解决方案吗?

【讨论】:

以上是关于为啥 hibernate 在不同的 JVM 实例中为相同的查询创建不同的列别名?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在尝试将 Hibernate Spatial 用于 Spring Boot 项目时出现此错误?实例化异常

为啥 Hibernate 不需要参数构造函数?

使用Hibernate进行数千次插入时的CPU利用率很高

对象的实例变量存储在 JVM 中的啥位置?

为啥 Hibernate 不填充这个外键列

Hibernate学习