博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate占位符警告:use named parameters or JPA-style positional parameters instead.
阅读量:6291 次
发布时间:2019-06-22

本文共 3572 字,大约阅读时间需要 11 分钟。

Hibernate占位符警告:use named parameters or JPA-style positional parameters instead.

 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

蕃薯耀 2016年8月19日 09:46:52 星期五

http://fanshuyao.iteye.com/

 

一、问题描述:

使用hibernate进行查询时,由于需要接收页面传入的查询条件,使用了问号占位符(),然后hibernate会在控制台输出一个警告信息,如下:

2016-08-19 09:44:27 [org.hibernate.hql.internal.ast.HqlSqlWalker]-[WARN] [DEPRECATION] Encountered positional parameter near line 1, column 77 in HQL: [select o from com.lqy.spring.iwx.bean.User o  where 1=1 and o.userName like ? and o.deleteType = ?1  order by o.createTime desc].  Positional parameter are considered deprecated; use named parameters or JPA-style positional parameters instead.

 

Positional parameter are considered deprecated; use named parameters or JPA-style positional parameters instead.

 

意思就是说:?号占位参数在考虑作废,请使用命名参数或者Jpa样式的占位参数代替。

 

二、解决方案:

 

方法一:改成命名参数的方式:

//命名参数的方式  String hql = "select t from t_usert where t.name=:name";  Query query = getSession().createQuery(hql);  query.setParameter("name", "李四");

 

方法二:改成JPA占位符的方式(?号后面有带数字):

//JPA占位符方式  String hql = "select t from t_user t where t.name=?0";  Query query = getSession().createQuery(hql);  query.setParameter(0, "李四");

 其中"?"后面的"0"代表索引位置,在HQL语句中可重复出现,并不一定要从0开始,可以是任何数字,只是参数要与其对应上。

 

例子:

 

以前我是这样写的,会提示警告,代码如下:

StringBuffer whereSql = new StringBuffer("");List params = new ArrayList();LinkedHashMap
orderBy = new LinkedHashMap
(); if(!StrUtils.isBlank(userName)){ whereSql.append(" and o.userName like ?"); params.add("%"+userName+"%");}if(!StrUtils.isBlank(loginName)){ whereSql.append(" and o.loginName = ?"); params.add(loginName);}

 

Query中设置参数的方法:

/**	 * 设置参数	 * 	 * @param query	 * @param params	 */	protected static void setParameters(Query query, Object[] params) {		if (null != query && null != params && params.length > 0) {			for (int i = 1; i <= params.length; i++) {				//query.setParameter(name, params[i - 1]);				query.setParameter(i, params[i - 1]);			}		}	}

  

 

为了去除警告,采用JPA样式占位符方式,因为这样修改起来比较简单,不需要修改[Query中设置参数的方法],代码如下:

StringBuffer whereSql = new StringBuffer("");List params = new ArrayList();LinkedHashMap
orderBy = new LinkedHashMap
(); int paramPosition = 1; if(!StrUtils.isBlank(userName)){ whereSql.append(" and o.userName like ?").append(paramPosition++); params.add("%"+userName+"%");}if(!StrUtils.isBlank(loginName)){ whereSql.append(" and o.loginName = ?").append(paramPosition++); params.add(loginName);}

 

只需要加多一个参数paramPosition,拼接sql时,也拼接在?号后面,就成了Jpa样式的占位参数,改动最小,比较省时省力。

 

 

采用命名参数方式:

StringBuffer whereSql = new StringBuffer("");LinkedHashMap
orderBy = new LinkedHashMap
();Map
paramsMap = new HashMap
(); if(!StrUtils.isBlank(userName)){ whereSql.append(" and o.userName like :userName"); paramsMap.put("userName", "%"+userName+"%");}if(!StrUtils.isBlank(loginName)){ whereSql.append(" and o.loginName = :loginName"); paramsMap.put("loginName", loginName);}

 

/**	 * 设置参数	 * @param query Query	 * @param paramsMap Map
paramsMap */ protected static void setParameters(Query query, Map
paramsMap) { if (null != query && null != paramsMap && paramsMap.size() > 0) { Set
set = paramsMap.keySet(); for (String key : set) { query.setParameter(key, paramsMap.get(key)); } } }

 

 采用命名参数方式,主要变动的是参数类型改成了Map,后面需要改动的地方比较多,如:很多查询的方法传入的参数都不一样,这样就需要重构,多写一个方法。

 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

蕃薯耀 2016年8月19日 09:46:52 星期五

http://fanshuyao.iteye.com/

转载地址:http://fpcta.baihongyu.com/

你可能感兴趣的文章
几个常用的ASP木马
查看>>
python分析postfix邮件日志的状态
查看>>
Mysql-5.6.x多实例配置
查看>>
psutil
查看>>
在git@osc上托管自己的代码
查看>>
机器学习算法:朴素贝叶斯
查看>>
小五思科技术学习笔记之扩展访问列表
查看>>
使用Python脚本检验文件系统数据完整性
查看>>
使用MDT部署Windows Server 2003 R2
查看>>
Redhat as5安装Mysql5.0.28
查看>>
通过TMG发布ActiveSync
查看>>
Web服务器的配置与管理(4) 配置访问权限和安全
查看>>
ClientScriptManager与ScriptManager向客户端注册脚本的区别
查看>>
js和php中几种生成验证码的方式
查看>>
android UI进阶之仿iphone的tab效果1
查看>>
这是我的第1个C#程序(向控制台输出一句话)
查看>>
html
查看>>
Xqk.Data数据框架开发指南:丰富的、灵活的查询方法(第三部分:SqlField)
查看>>
颜色空间系列4: RGB和YDbDr颜色空间的转换及优化算法
查看>>
Unity C# 设计模式(七)适配器模式
查看>>