【问题标题】:SQL aliases not working anymore after migrating from Hibernate 3 to 4从 Hibernate 3 迁移到 4 后 SQL 别名不再起作用
【发布时间】:2014-09-05 13:53:25
【问题描述】:

我正在将一个 Struts2 Web 应用程序从 Hibernate V3 迁移到 Hibernate 4.3.5。

在 Hibernate V3 中,我们使用了如下 SQL 语句,并且它们运行良好:

select u.id as id, 
       u.userId as userId, 
       sum(u.totalSearchedFields) as total, 
       u.date as date, 
       u.status as status 
from user u;

迁移到Hibernate V4.3.5后,上面的SQL语句报错:

org.hibernate.QueryException: , expected in SELECT

我们通过从 SQL 语句中删除别名使其工作,如下所示:

select u.id, 
       u.userId, 
       sum(u.totalSearchedFields), 
       u.date, 
       u.status 
from user u;

有人知道这是什么原因吗?如何在不删除别名的情况下解决此问题?

【问题讨论】:

  • 我不知道为什么会发生这种情况,但 Hibernate V4 似乎比 Hibernate V3 更严格(例如 V3 默默接受 where x = null 之类的东西,V4 会抛出异常)所以你可能会遇到同样的情况事物。恕我直言,选择中的别名无论如何都没有用,因为您无法在查询中解决它们,并且 Hibernate 在构建实体或结果列表时不会使用它们。
  • 也许您使用的某个别名现在被视为保留字(例如 total 或 date)。尝试通过更改别名来运行第一个查询,例如在每个别名的末尾附加 _FOO
  • date 和 user 是保留关键字。你不应该使用这些。还要检查其他别名和名称。
  • @AndreaLigios,感谢您编辑我的问题。现在似乎好多了。
  • 它不是一个实际的 SQL 查询,我替换了实际 SQL 查询中的所有列。例如。我替换了 u.date 而不是 u.lastModifiedDate..

标签: java sql hibernate hibernate-mapping


【解决方案1】:

显然,根据Hibernate 4 developer guide,别名应该以与您之前所做的“相反”的方式使用:

SELECT <PROPERTY_NAME> AS <ALIAS_TABLE.PROPERTY_NAME> 
  FROM TABLE AS <ALIAS_TABLE>

所以尝试改变这个:

select u.id as id, 
       u.userId as userId, 
       sum(u.totalSearchedFields) as total, 
       u.date as date, 
       u.status as status 
from user u;

到这里:

select id as {u.id},
       userId as {u.userId}, 
       sum(totalSearchedFields) as total, 
       date as {u.date}, 
       status as {u.status}
from user u;

该方法似乎与 SQL 的方法有点不同,因为此别名旨在供 Hibernate 使用以防止同名的多个列发生冲突,而在 SQL 中它们用于生成用户友好的 ResultSet。

顺便说一句,希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 2015-04-21
    相关资源
    最近更新 更多