Le mélange de JOIN implicite et explicite provoque une erreur Hibernate SQL
Dans les langages de requête de base de données, l'instruction JOIN est utilisée pour combiner les données de plusieurs tables en fonction d'une ou plusieurs colonnes communes. Dans Hibernate, un framework Java ORM populaire, il existe deux types de JOIN : implicites et explicites.
Question
Le mélange de JOIN implicites et explicites dans Hibernate peut entraîner un SQL invalide, générant des erreurs telles que "Le préfixe de colonne 'e1' ne correspond pas au nom de la table ou à l'alias utilisé dans la requête" dans MS2000 et dans MySQL "Colonne inconnue 'e1. managerEmployeeID' dans la clause 'on'".
Raison
Selon les normes SQL, le mot-clé JOIN a une priorité plus élevée que la virgule. Par conséquent, dans la déclaration suivante :
<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>
Les clauses JOIN sont évaluées avant les alias de table (e1, e2). Par conséquent, la référence à e1 dans l’expression ON n’est pas valide car e1 n’a pas été défini dans la clause FROM.
Solution
Pour résoudre ce problème, assurez-vous que tous les JOIN utilisent la même syntaxe de jointure, implicite ou explicite.
<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>
Astuce bonus : forcez Hibernate à utiliser JOIN explicite
Malheureusement, il n'existe aucun moyen documenté pour forcer Hibernate à utiliser uniquement des JOIN explicites. Cependant, vous pouvez essayer les solutions de contournement suivantes :
Veuillez noter que cette solution de contournement n'est pas officiellement prise en charge par Hibernate et peut avoir des conséquences inattendues.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!