jpa查询语句自动变成了update

6 篇文章 0 订阅

        这是之前写的。


        今天碰到了个奇怪的问题,明明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;
  }
 }



不报错了,也执行查询了,虽然成功了,可我还是不知道是怎么回事。
记录在这里,期望大侠指点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值