2016-10-20 2 views
1

Когда я выполняю этот запрос автообъединение из моей Java программыHSQLDB: Обнаружен дублированной SQL псевдоним

Query query = session.createSQLQuery("SELECT DISTINCT * " + 
      "FROM lerneinheit AS le1 JOIN lerneinheit AS le2 " + 
      "ON le1.datum = le2.datum AND le1.pid = le2.pid " + 
      " WHERE " + 
      " le1.datum BETWEEN '2016-10-20' AND '2016-10-20' AND " + 
      " le1.pid = 3 AND " + 
      " (le1.abgesagtrechtzeitig = false OR le1.nichtabgesagt = true OR le1.erschienen=true) AND " + 
      " (le2.abgesagtrechtzeitig = false OR le2.nichtabgesagt = true OR le2.erschienen=true) AND " + 
      " le1.lernid!= le2.lernid AND " + 
      " (le2.beginn+1 BETWEEN le1.beginn AND le1.ende OR le2.ende-1 BETWEEN le1.beginn AND le1.ende) " + 
      " ORDER BY le1.beginn"); 

Я получаю следующее сообщение об ошибке:

org.hibernate.loader.custom.NonUniqueDiscoveredSqlAliasException: Encountered a duplicated sql alias [LERNID] during auto-discovery of a native-sql query 

Хотя он отлично работает, если я сделайте это из phpAdmin. Все, что я нашел на этой теме, было совсем не полезно. Кто-нибудь понял, как это решить?

+2

Вместо 'SELECT DISTINCT *', используйте имя всех столбцов, которые вам действительно нужны. Используйте псевдонимы столбцов, чтобы отличать один и тот же столбец от двух псевдонимов таблицы. – fredt

+0

@fredt Мое намерение состояло в том, чтобы получить список, управляемый объектами Lerneinheit. Но, похоже, я буду использовать этот запрос для получения всех идентификаторов, а в другой функции я пытаюсь восстановить объекты по их идентификаторам. – Syrious

+0

Несмотря на это, вам не нужны два объекта в каждой строке SELECT. Вы можете попробовать 'SELECT DISTINCT le1. * FROM ...' – fredt

ответ

0

Я не уверен, но эквивалент HQL для != является <>, так тоу shourl написать " le1.lernid <> le2.lernid AND"

И кстати я рекомендую:

Query query = session.createSQLQuery("SELECT DISTINCT * " + 
     "FROM lerneinheit AS le1 JOIN lerneinheit AS le2 " + 
     "ON le1.datum = le2.datum AND le1.pid = le2.pid " + 
     " WHERE " + 
     " le1.datum BETWEEN :dateMin AND :dateMax AND " + 
     " le1.pid = :le1Pid AND " + 
     " (le1.abgesagtrechtzeitig = false OR le1.nichtabgesagt = true OR le1.erschienen=true) AND " + 
     " (le2.abgesagtrechtzeitig = false OR le2.nichtabgesagt = true OR le2.erschienen=true) AND " + 
     " le1.lernid!= le2.lernid AND " + 
     " (le2.beginn+1 BETWEEN le1.beginn AND le1.ende OR le2.ende-1 BETWEEN le1.beginn AND le1.ende) " + 
     " ORDER BY le1.beginn"); 
query.setParametter("dateMin", "2016-10-20"); 
query.setParametter("dateMax", "2016-10-20"); 
query.setParametter("le1Pid", 3); 
+0

Спасибо. Я действительно использую query.setParametter. Но я жестко запрограммировал его для тестирования. – Syrious

Смежные вопросы