解決jpa查詢語句自動變成瞭update的問題
jpa查詢語句自動變成瞭update
今天碰到瞭個奇怪的問題,明明dao中一個查詢函數,一直報connection read-only錯誤,斷點設置過去,發現明明一個select 查詢語句,一直到生成Query查看變量裡面都是查詢的代碼,可一執行就變成瞭update,簡直見瞭鬼瞭。
我的架構是sshj,層次也就是entity,dao,service,action,代碼如下,非常簡單的代碼:
dao層:
public boolean findCanXiaohu(String code) { try { String queryStr = " select count(*) from t_tablename "; Query query = em.createNativeQuery(queryStr); Long res = (Long) query.getSingleResult(); if (res > 0) { return false; } else { return true; } } catch (Exception e) { return true; } }
serivce層:
public boolean getCanXiaohu(String code){ return dao.findCanXiaohu(code); }
action層:
public String edit(){ String res = super.edit(); if ("1".equals(entity.getYhzhanghuxingzhi())) { String code = entity.getYhcunkuanrenbianhao(); canXiaohu = service.getCanXiaohu(code); } else { canXiaohu = true; } return "input"; }
剛開始我以為是因為在action層我寫進瞭prepareModel方法中,這個方法按道理也沒有寫入數據庫操作,但以防萬一吧,我改到瞭edit方法下,這個方法也就是打開一個編輯頁面,其prepareEdit函數中執行瞭prepareModel,也不過根據傳遞的id從數據庫中查找entity。
奇怪就奇怪在一執行到getCanXiaohu,看斷點也執行到瞭dao.findCanXiaohu(),實話說,我在前面查找問題過程中,還把函數名都改成這樣瞭,原來沒有前綴find、get,就如同上面說的,我斷點設置到查詢語句,一步步執行,生成query的時候看裡面的語句還是select,可一執行到query.getSingleResult(),它就直接異常,然後看輸出的語句,就成瞭一個update t_table的語句,其中的set語句set 各字段的值,因為這個函數是查詢函數,沒加事務,所以不能執行update,所以就會異常出錯。但它就是個查詢,我也並不打算做修改,不知道為什麼會出這樣的問題,怎麼改都不行,也搞不明白是怎麼回事。
我就各種試,最後, 我把語句改成瞭jpql標準語句,然後,居然可以瞭!!!!!!
public boolean findCanXiaohu(String code) { try { String queryStr = " select count(o) from ClassName o "; Query query = em.createQuery(queryStr); Long res = (Long) query.getSingleResult(); if (res > 0) { return false; } else { return true; } } catch (Exception e) { return true; } }
不報錯瞭,也執行查詢瞭,雖然成功瞭,可我還是不知道是怎麼回事。
JPA框架中UPDATE語句問題
一定要加上下面這個兩個註解啊啊啊啊啊!!!!!
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Spring data jpa @Query update的坑及解決
- Java之jpa入門教程講解
- spring data jpa @Query註解中delete語句報錯的解決
- 使用JPA自定義SQL查詢結果
- 在Jpa框架下拼接原生sql 並執行的操作