解決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。

推薦閱讀: