【问题标题】:Using of ORACLE rowId in Hibernate Criteria在 Hibernate Criteria 中使用 ORACLE rowId
【发布时间】:2013-02-18 09:45:00
【问题描述】:

我有 ORACLE DB 和 2 个表。 我需要从 table1 内部连接 ​​table2 中选择行并按 ORACLE RowID 列排序。 要选择我使用标准查询。 要按语句添加订单,我使用

criteria.addOrder(Order.asc("this.rowId"));

在映射 RowId 的样子

<property name="rowId" column="ROWID" insert="false" update="false"/>

但是hibernate会生成错误的sql查询,比如

select this_.docId as attr0_, this_.name as attr1_ from table1 this_ inner join table2 t2_ on this_.docId=t2_.docId order by ROWID asc

Hibernate 从查询中删除别名“this”。因为 ORACLE 中的所有表都有 ROWID 列,所以我们有 oracle 错误 ORA-00918

如何通过休眠条件编写正确的查询以按 oracle RowId 列排序?

【问题讨论】:

  • 功能问题,你为什么order by rowid
  • 因为如果我们排序并且行具有相同的值,Oracle 会以随机顺序返回行。 Tom Say
  • 也许可以,但是如果您删除一行,然后插入另一行,它将填补空白。因此,破坏您的订单,或者至少在您的“有序数据”中间插入一些数据。
  • 如果您有可用的主键或唯一键,那么我会按其中一个键而不是 ROWID 进行排序——它还会为您提供确定性的排序顺序。在这里使用 ROWID 没有任何好处。似乎按 this_.docId 或 this_.name 排序是有意义的
  • 我认为这是休眠错误。作为解决方法,我们可以在映射中使用带引号的列名,例如 &lt;property name="rowId" column="`ROWID`" insert="false" update="false"/&gt;

标签: oracle hibernate hibernate-criteria rowid


【解决方案1】:

Hibernate 认为 rowid 是一个 oracle 函数,但它是一个列标识符。要说休眠,rowid 是一个列名,我们需要将休眠映射写为

<property name="rowId" column="`ROWID`" insert="false" update="false"/>

【讨论】:

    猜你喜欢
    • 2018-08-24
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2010-12-15
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    相关资源
    最近更新 更多