我正在使用 Hibernate 3.2.5。当我使用JOIN
时,我可以看到Hibernate生成的sql查询是Oracle 9i版本之前的语法。查询使用 (+) 符号来表示 LEFT OUTER JOIN
,而不是使用 LEFT OUTER JOIN
等等。
对于此标准:
Criteria criteria = session.createCriteria(Dept.class).createAlias("empMap","id",CriteriaSpecification.LEFT_JOIN).add(Restrictions.eq("deptId", new Integer(6)));
这是生成的 SQL 查询:
select this_.DEPT_ID as DEPT1_1_1_, this_.DEPT_NAME as DEPT2_1_1_, id1_.DEPT_ID as DEPT2_3_, id1_.EMP_ID as EMP1_3_, id1_.EMP_ID as formula0_3_, id1_.EMP_ID as EMP1_0_0_, id1_.DEPT_ID as DEPT2_0_0_, id1_.EMP_NAME as EMP3_0_0_, id1_.AGE as AGE0_0_, id1_.SEX as SEX0_0_ from dept this_, emp id1_ where this_.DEPT_ID=id1_.DEPT_ID(+) and this_.DEPT_ID=?
我的问题是:
1) 为什么查询使用旧语法?如果我使用 Hibernate 4.0 或最新版本,那么它会生成新语法的 SQL 查询吗?
2) 在这种情况下如何执行Outer Join
?我可以看到 LEFT JOIN
和 FULL JOIN
的选项,但看不到 RIGHT JOIN
编辑
问。 2 这是一个拼写错误,它是RIGHT JOIN
请让我知道这些。
问候,
最佳答案
如果你看current Hibernate source code ,然后你会看到有许多不同的 SQL dialects对于甲骨文:
- 8 - 已弃用,取而代之的是 8i
- 8i - 生成
(+)
语法 - 9 - 已弃用,取而代之的是 9i 或 10g
- 9i - 生成
(+)
语法,并带有注释指定不使用“ANSI 连接语法”,因为 9i 似乎无法在所有情况下正确处理它 - 10g - 生成 ANSI 连接
因此,获得 ANSI 连接语法的唯一方法是使用 10g 方言。我不知道 3.2.5 中是否存在这种情况,或者是否存在,那里的版本是否生成 ANSI 连接,但这是您唯一可以尝试的事情。
关于java - 使用 Oracle 生成的 SQL 查询语法是旧的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13429186/