我有一個表X
,它有一列BALANCE
。我有兩個行ID和值amount
。有兩個約束變量 - MAX_BALANCE
和MIN_BALANCE
。根據兩種不同的約束更新兩行
我需要編寫一個更新查詢來更新列BALANCE
。第一行ID BALANCE
與amount
相加,並且amount
從第二行ID的BALANCE
中減去。我需要確保BALANCE
始終保持在該範圍內。即,MIN_BALANCE
< = BALANCE
< = MAX_BALANCE
。
我不應該更新一行,如果更新的行數不等於2,則回滾。更新查詢應更新兩行(成功大小寫),或者根本不應更新任何行。
我在Java中使用Hibernate,這裏是我試過的查詢。它不適用於成功案例。
String sql = "UPDATE X x "
+ "SET x.balance = CASE "
+ "WHEN x.id = :rowId1 THEN (x.balance + :amount) "
+ "WHEN x.id = :rowId2 THEN (x.balance - :amount) "
+ "END "
+ "WHERE x.id IN :ids "
+ "AND ((x.id = :rowId1 AND x.balance + :amount <= :MAX_BALANCE) "
+ "OR (x.id = :rowId2 AND x.balance - :amount >= :MIN_BALANCE))";
Query query = entityManager.createQuery(sql);
List<BigInteger> ids = Arrays.asList(new BigInteger(rowId1), new BigInteger(rowId2));
int rows = query.setParameter("amount", amount)
.setParameter("ids", ids)
.setParameter("rowId1", new BigInteger(rowId1))
.setParameter("rowId2", new BigInteger(rowId2))
.setParameter("MAX_BALANCE", new Float(MAX_BALANCE))
.setParameter("MIN_BALANCE", new Float(MIN_BALANCE))
.executeUpdate();
我不想檢查是否rows == 1
並拋出異常。更新查詢應始終確保行將採用0或2的值。
或者有沒有一種方法可以基於Hibernate中的Criteria Update執行此操作?
不,它不起作用。當一個餘額達到負值時,它將得到'null'值。 –
如果rowId2沒有足夠的餘額,那麼你需要做什麼? –
我不應該更新任何行。 –