Rumah >pangkalan data >tutorial mysql >Mengapa Mencampurkan Gabungan Tersirat dan Eksplisit dalam Hibernate Membawa kepada Ralat SQL?
Mencampurkan JOIN tersirat dan eksplisit menyebabkan ralat Hibernate SQL
Dalam bahasa pertanyaan pangkalan data, pernyataan JOIN digunakan untuk menggabungkan data daripada berbilang jadual berdasarkan satu atau lebih lajur biasa. Dalam Hibernate, rangka kerja Java ORM yang popular, terdapat dua jenis JOIN: implisit dan eksplisit.
Soalan
Mencampurkan JOIN tersirat dan eksplisit dalam Hibernate boleh mengakibatkan SQL tidak sah, ralat melontar seperti "Awalan lajur 'e1' tidak sepadan dengan nama jadual atau alias yang digunakan dalam pertanyaan" dalam MS2000 dan dalam MySQL "Lajur tidak diketahui 'e1. pengurusEmployeeID' dalam 'pada klausa'".
Sebab
Mengikut piawaian SQL, kata kunci JOIN mempunyai keutamaan yang lebih tinggi daripada koma. Oleh itu, dalam pernyataan berikut:
<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>
Klausa JOIN dinilai sebelum alias jadual (e1, e2). Akibatnya, rujukan kepada e1 dalam ungkapan ON adalah tidak sah kerana e1 belum ditakrifkan dalam klausa FROM.
Penyelesaian
Untuk menyelesaikan isu ini, pastikan semua JOIN menggunakan sintaks gabungan yang sama, sama ada tersirat atau eksplisit.
<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>
Petua Bonus: Paksa Hibernate untuk menggunakan JOIN yang jelas
Malangnya, tiada cara yang didokumenkan untuk memaksa Hibernate hanya menggunakan JOIN yang jelas. Walau bagaimanapun, anda boleh mencuba penyelesaian berikut:
Sila ambil perhatian bahawa penyelesaian ini tidak disokong secara rasmi oleh Hibernate dan mungkin mempunyai akibat yang tidak diingini.
Atas ialah kandungan terperinci Mengapa Mencampurkan Gabungan Tersirat dan Eksplisit dalam Hibernate Membawa kepada Ralat SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!