2016-10-20 3 views
1

내 자바 프로그램에서 자체 조인 중복 된 SQLHSQLDB : 발생했습니다 내가 사용하여이 쿼리를 실행하면 별칭

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

을 실제로 필요한 모든 열의 이름입니다. 컬럼 별명을 사용하여 두 테이블 별명과 동일한 컬럼을 구별하십시오. – fredt

+0

@fredt 제 의도는 Lerneinheit-Objects를 관리하는 목록을 얻는 것이 었습니다. 하지만이 쿼리를 사용하여 모든 ID를 가져오고 다른 함수에서 해당 ID로 개체를 검색하려고합니다. – Syrious

+0

그렇다고하더라도 SELECT의 각 행에 두 개의 개체가 필요하지는 않습니다. 'DISTINCT le1. * FROM ... '시도해보십시오. – fredt

답변

0

는 잘 모르겠어요하지만 !=에 대한 HQL 상당 <>, 그래서 가나는 " le1.lernid <> le2.lernid AND"

쓰기 shourl 그리고 그런데 나는 추천 : 대신 *`는을 사용하여 DISTINCT SELECT`의

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.setParameterter를 사용합니다. 하지만 테스트 목적으로 하드 코딩했습니다. – Syrious

관련 문제