0

我正在使用休眠 3.2.5。当我使用 a 时,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 查询吗?

Outer Join2)在这种情况下如何执行?我可以看到选项LEFT JOINFULL JOIN但看不到任何内容RIGHT JOIN

编辑

Q. 2 这是一个拼写错误,它的RIGHT JOIN

请让我知道这些。

问候,

4

2 回答 2

3

如果您查看当前的 Hibernate 源代码,您会发现 Oracle 有许多不同的SQL 方言

  • 8 - 已弃用,取而代之的是 8i
  • 8i - 生成(+)语法
  • 9 - 支持 9i 或 10g 已弃用
  • 9i - 生成(+)语法,带有注释指定不使用“ANSI 连接语法”,因为 9i 似乎在所有情况下都不能正确处理它
  • 10g - 生成 ANSI 连接

因此,获得 ANSI 连接语法的唯一方法是使用 10g 方言。我不知道 3.2.5 中是否存在,或者是否存在,它的版本是否会生成 ANSI 连接,但这是您唯一可以尝试的方法。

于 2012-11-17T10:32:50.007 回答
0

广告 2)如果您有“左连接”和“完全连接”(我猜是“右连接”)选项,那么您可以执行外连接。这是外连接的三种现有类型。没有“纯”外连接这样的东西。

于 2012-11-17T12:22:12.997 回答