Hibernate占位符警告:use named parameters or JPA-style positional parameters instead.
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<Object> params = new ArrayList<Object>();
LinkedHashMap<String, String> orderBy = new LinkedHashMap<String, String>();
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<Object> params = new ArrayList<Object>();
LinkedHashMap<String, String> orderBy = new LinkedHashMap<String, String>();
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<String, String> orderBy = new LinkedHashMap<String, String>();
Map<String, Object> paramsMap = new HashMap<String, Object>();
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<String, Object> paramsMap
*/
protected static void setParameters(Query query, Map<String, Object> paramsMap) {
if (null != query && null != paramsMap && paramsMap.size() > 0) {
Set<String> set = paramsMap.keySet();
for (String key : set) {
query.setParameter(key, paramsMap.get(key));
}
}
}
采用命名参数方式,主要变动的是参数类型改成了Map,后面需要改动的地方比较多,如:很多查询的方法传入的参数都不一样,这样就需要重构,多写一个方法。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
蕃薯耀 2016年8月19日 09:46:52 星期五
http://fanshuyao.iteye.com/
Hibernate占位符警告:use named parameters or JPA-style positional parameters instead.的更多相关文章
- Hibernate占位符?和:及JPA
		小结一下hibernate占位符. 1.最常见的?占位符. String hql = "select a from Apple a where a.color=? a.weight>? ... 
- hibernate查询语句hql中的占位符?参数与命名参数:name设值方式搞混
		先贴出异常 Struts has detected an unhandled exception: Messages: Position beyond number of declared ordin ... 
- hibernate的like用法(用占位符解决)
		原本我的写法:Query repeatClientQuery=querysession.createQuery("from ClientInfo as a " +"whe ... 
- java:Hibernate框架3(使用Myeclipse逆向工程生成实体和配置信息,hql语句各种查询(使用hibernate执行原生SQL语句,占位符和命名参数,封装Vo查询多个属性,聚合函数,链接查询,命名查询),Criteria)
		1.使用Myeclipse逆向工程生成实体和配置信息: 步骤1:配置MyEclipse Database Explorer: 步骤2:为项目添加hibernate的依赖: 此处打开后,点击next进入 ... 
- Hibernate HQL基础 使用参数占位符
		在HQL中有两种方法实现使用参数占用符 1.使用? 使用?设置参数占位符,之后通过setString()和setInteger()等方法为其赋值.如: Query query = session.cr ... 
- Hql参数占位符使用(转+整理)
		在Hibernate 4版本中,对于Hql有一点点改变,如果你还是按照以前的方式去编写HQL Query query = sessionFactory.openSession().createQuer ... 
- Hql中占位符(转)
		在新的Hibernate 4版本中,对于Hql有一点点改变,如果你还是按照以前的方式去编写HQL并且用了以下占位符的方式,就会得到一个警告. 参考资料:https://hibernate.atlass ... 
- Hibernate4.1之后关于占位符的问题
		hibernate 4.1之后对于HQL中查询参数的占位符做了改进,如果仍然用老式的占位符会有类似如下的告警信息 [main] WARN [org.hibernate.hql.internal.ast ... 
- python-sqlite3之占位符
		The sqlite3 module supports two kinds of placeholders: question marks (qmark style) and named placeh ... 
随机推荐
- 从C#到Python —— 4 类及面向对象
			http://www.cnblogs.com/yanxy/archive/2010/04/04/c2p_4.html 如果你熟悉C#,那么对类(Class)和面向对象(Object Oriented) ... 
- 集合ArrayList双色球练一练(自己的方法,太麻烦)
			namespace 集合__双色球练一练{ class Program { static void Main(string[] args) { / ... 
- 替换SQL Server字段中的换行符,回车符
			replace(string_expression , string_pattern , string_replacement) 第一个参数:要查找的字段. 第二个参数:要查找的字符. 第三个参数:要 ... 
- Linux实时将所有输出重定向到文件
			Linux的重定向机制十分好用,我们经常需要在服务器上挂起一个服务程序,然后将该程序的所有输出重定向到某个文件,这样即使我们注销了用户,程序依然在linux服务器上运行着. 但是重定向的输出经常无法实 ... 
- Windows 8/8.1系统下硬盘占用率100%的问题解决思路汇总
			家庭组 2.关闭虚拟内存 3.关闭Windows 8快速开机功能 4.服务进程superfetch 5.系统下软件排除 操作步骤: 1.Windows 8系统的家庭组方便多人不用存储设备就能在局域网中 ... 
- Ubuntu 使用apt-get时提示错误:无法获得锁 /var/lib/dpkg/lock
			推荐博客:http://blog.sina.com.cn/s/blog_5c1450a8010188ju.html Ubuntu 使用apt-get时提示错误:无法获得锁 /var/lib/dpkg/ ... 
- Oracle translate 函数
			项目里要求对军人身份证特殊处理,只要数字位.本想用正则表达式,但是oracle9i不支持正则. 后来发现translate 可以实现功能. translate(string,from_str,to_s ... 
- jQuery 参考手册 - 事件
			事件方法会触发匹配元素的事件,或将函数绑定到所有匹配元素的某个事件. bind()向匹配元素附加一个或更多事件处理器 $(selector).bind(event,function) $(select ... 
- Hdu 5213-Lucky  莫队,容斥原理,分块
			题目:http://acm.hdu.edu.cn/showproblem.php?pid=5213 Lucky Time Limit: 6000/3000 MS (Java/Others) Me ... 
- [LeetCode] 16. 3Sum Closest 解题思路
			Given an array S of n integers, find three integers in S such that the sum is closest to a given num ... 
