ホームページ >データベース >mysql チュートリアル >Hibernate で暗黙的 JOIN と明示的 JOIN を混在させると SQL エラーが発生するのはなぜですか?
暗黙的 JOIN と明示的 JOIN を混在させると Hibernate SQL エラーが発生する
データベース クエリ言語では、JOIN ステートメントを使用して、1 つ以上の共通の列に基づいて複数のテーブルのデータを結合します。人気のある Java ORM フレームワークである Hibernate には、暗黙的と明示的の 2 種類の 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 中国語 Web サイトの他の関連記事を参照してください。