java - 使用 Oracle 生成的 SQL 查询语法是旧的

标签 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=?

我的问题是:

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

2) 在这种情况下如何执行Outer Join?我可以看到 LEFT JOINFULL 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/

相关文章:

sql - 替代子查询的外部连接?

java - 如何更改 MySQL session 数据库?

java - hibernate 查询缓存指定缓存持续时间

java - 仅加载 Spring 框架所需的服务

java - fragment 销毁后的 fragment 对象; GC什么时候收集它们?

sql - 可以禁用 Oracle 中的 SQL 执行计划吗?

oracle - v$实例权限错误

java - Hibernate - 访问一对多关联的子元素时出现 NullPointerException

java - 任何使用 Orient DB 数据库的开源软件?您有使用该数据库的经验吗?

java - 如何使用MockClassLoader?