![](/img/trans.png)
[英]Batch insert with Hibernate and Oracle does not log which entity causes the ConstraintViolationException
[英]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, rownum
和select 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.