我在尝试将 Hibernate 与 MySQL 结合使用时遇到了一个奇怪的错误。我有以下命名查询:
SELECT SUM(s.plotline.value), s.character FROM Story as s WHERE s.chapter.chapterID = ?1 GROUP BY s.character ORDER BY SUM(s.plotline.value)
这会被翻译成以下 SQL 语句:
select sum(plotline1_.Value) as col_0_0_, story0_.CharacterID as col_1_0_, character2_.CharacterID as Characte1_5_,
character2_.AuthorID as AuthorID5_, character2_.BookID as BookID5_, character2_.CharacterName as Characte2_5_,
character2_.LastModified as LastModi3_5_
from fantasy.story story0_, fantasy.plotline plotline1_
inner join fantasy.character character2_ on story0_.CharacterID=character2_.CharacterID
where story0_.PlotlineID=plotline1_.PlotlineID and story0_.ChapterID= 4
group by story0_.CharacterID
order by count(plotline1_.Value)
当我执行此操作时,我得到:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'story0_.CharacterID' in 'on clause'
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
java.lang.reflect.Constructor.newInstance(Unknown Source)
com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
com.mysql.jdbc.Util.getInstance(Util.java:382)
如果我将查询更改为此并直接在 SQL 中运行它,它会正常运行:
select sum(plotline1_.Value) as col_0_0_, story0.CharacterID as col_1_0_, character2_.CharacterID as Characte1_5_,
character2_.AuthorID as AuthorID5_, character2_.BookID as BookID5_, character2_.CharacterName as Characte2_5_,
character2_.LastModified as LastModi3_5_
from fantasy.story story0, fantasy.plotline plotline1_
inner join fantasy.character character2_ on CharacterID = character2_.CharacterID
where story0.PlotlineID=plotline1_.PlotlineID and story0.ChapterID= 4
group by story0.CharacterID
order by count(plotline1_.Value)
这个问题有两个部分
- 为什么在连接中删除对 CharacterID 的显式限定可以使此工作正常进行?我的经验主要是使用 SQL Server,如果您尝试以这种方式编写查询,它实际上会失败。
- 有没有办法让 Hibernate 以正确的形式向我提供查询或调整我的 MySQL 配置,以便它以 Hibernate 生成查询的方式接受查询?
最佳答案
您的第一个请求不起作用,因为“on 子句”中的“story0_”未知
from fantasy.story story0_, fantasy.plotline plotline1_ inner join fantasy.character character2_ on story0_.CharacterID=character2_.CharacterID
当您编写“from A, B inner join C”时,SQL(5.0 版及更高版本)仅考虑 B 和 C 之间的内部连接,然后仅允许在这两个表之间使用“on 子句”。
2 个解决方案应该有效:
- 添加括号
from (fantasy.storystory0_,fantasy.plotlineplotline1_)在story0_.CharacterID=character2_.CharacterID上内连接fantasy.charactercharacter2_
- 更改表格顺序
从fantasy.plotlineplotline1_,fantasy.storystory0_内部加入fantasy.charactercharacter2_在story0_.CharacterID=character2_.CharacterID
更多详细信息请访问:https://bugs.mysql.com/bug.php?id=13551
我想您找到的解决方案是有效的,因为CharacterID也是plotline1_中的一个字段
我目前在使用 Hibernate 时面临这个问题,即使我找到了 SQL 语句引发异常的原因(以及如何纠正它),我也不知道如何配置 Hibernate 以强制它生成这些 2 之一解决方案。
如果有人知道如何使用 Hibernate 进行此操作,感谢您的帮助!
关于java - Hibernate MySQL 查询错误“Join On 中的未知列”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5162685/