【发布时间】: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 排序是有意义的
-
我认为这是休眠错误。作为解决方法,我们可以在映射中使用带引号的列名,例如
<property name="rowId" column="`ROWID`" insert="false" update="false"/>
标签: oracle hibernate hibernate-criteria rowid