암시적 JOIN과 명시적 JOIN을 혼합하면 Hibernate SQL 오류가 발생합니다
데이터베이스 쿼리 언어에서 JOIN 문은 하나 이상의 공통 열을 기반으로 여러 테이블의 데이터를 결합하는 데 사용됩니다. 널리 사용되는 Java ORM 프레임워크인 Hibernate에는 암시적 JOIN과 명시적 JOIN의 두 가지 유형이 있습니다.
질문
Hibernate에서 암시적 JOIN과 명시적 JOIN을 혼합하면 유효하지 않은 SQL이 발생하여 MS2000에서는 "열 접두사 'e1'이 쿼리에 사용된 테이블 이름이나 별칭과 일치하지 않습니다.", MySQL에서는 "알 수 없는 열 'e1. 'on 절'의 'managerEmployeeID''입니다.
이유
SQL 표준에 따르면 JOIN 키워드는 쉼표보다 우선순위가 높습니다. 따라서 다음 문장에서:
<code class="language-sql">SELECT e1.name, e2.name, e1Manager.name FROM Employee e1, Employee e2 INNER JOIN Employee e1Manager ON e1.managerEmployeeID = e1Manager.employeeID</code>
JOIN 절은 테이블 별칭(e1, e2)보다 먼저 평가됩니다. 결과적으로 FROM 절에 e1이 정의되지 않았기 때문에 ON 표현식의 e1에 대한 참조는 유효하지 않습니다.
솔루션
이 문제를 해결하려면 모든 JOIN이 암시적이든 명시적이든 동일한 조인 구문을 사용하는지 확인하세요.
<code class="language-sql">-- 显式JOIN: SELECT e1.name, e2.name, e1Manager.name FROM Employee e1 CROSS JOIN Employee e2 INNER JOIN Employee e1Manager ON e1.managerEmployeeID = e1Manager.employeeID -- 隐式JOIN: SELECT e1.name, e2.name, e1Manager.name FROM Employee e1, Employee e2, Employee e1Manager WHERE e1.managerEmployeeID = e1Manager.employeeID</code>
보너스 팁: Hibernate가 명시적인 JOIN을 사용하도록 강제
안타깝게도 Hibernate가 명시적인 JOIN만 사용하도록 강제하는 문서화된 방법은 없습니다. 그러나 다음 해결 방법을 시도해 볼 수 있습니다.
이 해결 방법은 Hibernate에서 공식적으로 지원되지 않으며 의도하지 않은 결과를 초래할 수 있습니다.
위 내용은 Hibernate에서 암시적 JOIN과 명시적 JOIN을 혼합하면 SQL 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!