Oracle生成的SQL查询语法很旧

时间:2012-11-17 09:07:44

标签: java oracle hibernate

我正在使用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=?

My Queston是:

1)为什么查询具有旧语法?如果我使用Hibernate 4.0或最新版本,那么它会生成新的语法SQL查询吗?

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

修改

Q值。 2这是一个错字错误,RIGHT JOIN

请让我知道这些。

此致

2 个答案:

答案 0 :(得分:3)

如果您查看current Hibernate source code,那么您会发现Oracle有许多不同的SQL dialects

  • 8 - 弃用赞成8i
  • 8i - 生成(+)语法
  • 9 - 弃用赞成9i或10g
  • 9i - 生成(+)语法,注释指定不使用“ANSI连接语法”,因为9i似乎无法在所有情况下正确处理 < / LI>
  • 10g - 生成ANSI连接

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

答案 1 :(得分:0)

广告2)如果您有“左连接”和“完全加入”(以及我猜,“右连接”)选项,则可以执行外连接。这些是外连接的三种现有类型。没有“纯粹”的外部联接。