簡體   English   中英

Hibernate生成Oracle的查詢,導致ORA-02014

[英]Hibernate generating query for Oracle which causes ORA-02014

我的項目使用Hibernate版本4.0.1.Final和JPA 2.0。 我需要更改一個HQL - 添加順序,看起來很簡單,除了它現在以SQL sytax錯誤結束。

我已經定義了這個HQL命名查詢:

SELECT s FROM Entity s WHERE s.status =:status ORDER BY s.priority,s.startDate

- > Bold是我要添加的部分。

現在,因為這個命名查詢是使用lock執行的 - LockModeType.PESSIMISTIC_WRITE它為Oracle創建更新選擇:

select *
  from (select entity.field 

  ...more fields...

          from DB_TABLE entity
         where (entity.STATUS = ?)
         order by entity.PRIORITY, entity.DISTRIB_START_DATE)
 where rownum <= ?
   for update

而這個查詢以。結尾

java.sql.SQLSyntaxErrorException:ORA-02014無法從具有DISTINCT,GROUP BY的視圖中選擇FOR UPDATE

沒有訂單部分它的工作正常。

有什么辦法可以克服這個問題嗎? 我只需要按順序選擇那些記錄。 也無法在應用程序中對它們進行排序導致其僅選擇表的一部分。

我試圖將Hibernate更新到4.2.21.Final,但結果是一樣的。 Hibernate 4.3+需要JPA2.1,我不使用它。
也許這是Hibernate的錯誤?

不,它不是Hibernate的錯誤,它是你在Oracle中與rownum結合使用的方式。 有關詳細信息,請參閱此文章

基本上,這意味着您無法在Oracle的同一查詢中組合order, rownumselect for update

您必須將其分解為更多查詢,具體方法取決於您的具體要求。 例如:

1)選擇具有分頁排序的實體的ID:

SELECT s.id FROM Entity s WHERE s.status = :status ORDER BY s.priority, s.startDate

2)使用獲得的id選擇具有鎖定的實體:

SELECT s FROM Entity s WHERE s.id in :ids AND s.status = :status

3)如果所選實體的計數小於id的計數,則在此期間條件已更改(狀態已更改),繼續使用鎖定的實例或回滾進行處理,然后重試整個事務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM