Hibernate MySQL Query Error Неизвестный столбец в Join On - PullRequest
2 голосов
/ 02 марта 2011

Я получаю странную ошибку при попытке использовать 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?

1 Ответ

1 голос
/ 10 сентября 2015

Ваш первый запрос не работает, потому что "story0_" неизвестно в предложении "on"

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, чтобы он генерировал один из тезисов 2 решения.

Если кто-нибудь знает, как это сделать с помощью Hibernate, спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...