2011-03-02 87 views
2

我遇到了一个奇怪的错误,试图在MySQL中使用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) 

有两个部分对这一问题

  1. 为什么去掉明确资格中或CharacterId的连接,使这项工作?我的经验主要是使用SQL Server,如果您尝试以这种方式编写查询,它实际上会失败。
  2. 有没有办法让Hibernate以适当的形式给我提供查询或调整我的MySQL配置,以便它接受Hibernate产生它的方式的查询?
+0

我可能已经找到了第1部分的解释http://krisgale.com/beware-of-table-alias-in-left-join/似乎MySQL决定要求括号多个表,如果他们在选择从版本5开始。这不帮助我修复我的hibernate查询,这里的帮助仍然非常感谢 – 2011-03-02 02:22:52

回答

0
  1. “字符”是MySQL中的保留字。这可能是抛出查询的原因吗?

  2. 您可以强制Hibernate在生成的SQL中引用标识符,方法是在映射文档中将反斜杠中的表或列名称括起来。 Hibernate将为SQL方言使用正确的引号样式(通常使用双引号,但括号表示SQL Server,反引号表示MySQL)。

1

你的第一个请求没有因为 “story0_” 的工作尚处于 “上条款” 当你写

from fantasy.story story0_, fantasy.plotline plotline1_ inner join fantasy.character character2_ on story0_.CharacterID=character2_.CharacterID 

“从A,B内加入C” 未知,SQL(5.0版本及稍后)只考虑B和C之间的内部关节,然后只允许这两个表之间的“on子句”。

2解决方案应该工作:

  • 添加括号

from (fantasy.story story0_, fantasy.plotline plotline1_) inner join fantasy.character character2_ on story0_.CharacterID=character2_.CharacterID

  • 变化表顺序

from fantasy.plotline plotline1_, fantasy.story story0_ inner join fantasy.character character2_ on story0_.CharacterID=character2_.CharacterID

更多详细信息,请访问:https://bugs.mysql.com/bug.php?id=13551

我想,解你已经找到工作,因为或CharacterId也是plotline1_场

我目前面临这个问题与Hibernate,即使我发现为什么SQL语句引发了异常(以及如何纠正它),我不知道如何配置Hibernate来迫使它生成这两种解决方案之一。

如果有人知道如何用Hibernate做到这一点,谢谢你的帮助!