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.的更多相关文章

  1. Hibernate占位符?和:及JPA

    小结一下hibernate占位符. 1.最常见的?占位符. String hql = "select a from Apple a where a.color=? a.weight>? ...

  2. hibernate查询语句hql中的占位符?参数与命名参数:name设值方式搞混

    先贴出异常 Struts has detected an unhandled exception: Messages: Position beyond number of declared ordin ...

  3. hibernate的like用法(用占位符解决)

    原本我的写法:Query repeatClientQuery=querysession.createQuery("from ClientInfo as a " +"whe ...

  4. java:Hibernate框架3(使用Myeclipse逆向工程生成实体和配置信息,hql语句各种查询(使用hibernate执行原生SQL语句,占位符和命名参数,封装Vo查询多个属性,聚合函数,链接查询,命名查询),Criteria)

    1.使用Myeclipse逆向工程生成实体和配置信息: 步骤1:配置MyEclipse Database Explorer: 步骤2:为项目添加hibernate的依赖: 此处打开后,点击next进入 ...

  5. Hibernate HQL基础 使用参数占位符

    在HQL中有两种方法实现使用参数占用符 1.使用? 使用?设置参数占位符,之后通过setString()和setInteger()等方法为其赋值.如: Query query = session.cr ...

  6. Hql参数占位符使用(转+整理)

    在Hibernate 4版本中,对于Hql有一点点改变,如果你还是按照以前的方式去编写HQL Query query = sessionFactory.openSession().createQuer ...

  7. Hql中占位符(转)

    在新的Hibernate 4版本中,对于Hql有一点点改变,如果你还是按照以前的方式去编写HQL并且用了以下占位符的方式,就会得到一个警告. 参考资料:https://hibernate.atlass ...

  8. Hibernate4.1之后关于占位符的问题

    hibernate 4.1之后对于HQL中查询参数的占位符做了改进,如果仍然用老式的占位符会有类似如下的告警信息 [main] WARN [org.hibernate.hql.internal.ast ...

  9. python-sqlite3之占位符

    The sqlite3 module supports two kinds of placeholders: question marks (qmark style) and named placeh ...

随机推荐

  1. [转贴]漫谈C语言及如何学习C语言

    抄自http://my.oschina.net/apeng/blog/137911,觉得很有用,收藏它 目录:[ - ] 为什么要学习C语言? C语言学习方法 1,参考书籍 2,动手实验环境搭建 3, ...

  2. HTML图片热点、网页划区、拼接、表单

    一.图片热点: 规划出图片上的一个区域,可以做出超链接,直接点击图片区域就可以完成跳转的效果. 示例: 二.网页划区: 在一个网页里,规划出一个区域用来展示另一个网页的内容. 示例: 三.网页的拼接: ...

  3. BZOJ_1269_文本编辑器_[AHOI2006]_(Spaly)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1269 和BZOJ_1507很像的题,多了一个反转操作,还是Splay简单区间操作的模板题. 1 ...

  4. HDU 5948 Thickest Burger 【模拟】 (2016ACM/ICPC亚洲区沈阳站)

    Thickest Burger Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  5. tcp/ip体系-转载

    如果还想在测试这条路上继续走下去的话,那么下面这些东西就是我们必须去掌握的,至少你还不想止步于简单的黑盒测试--其实,一直想去接触Linux下的应用测试,这样能学到东西会很多,而且会非常的受用.之前听 ...

  6. IIS6、IIS7和IIS8各版本的差别

    一.写在前面 目前市面上所用的IIS版本估计都是>=6.0的.所以我们主要以下面三个版本进行讲解 服务器版本 IIS默认版本 server2003 6.0 server2008 7.0 serv ...

  7. Unity3d Fast Indirect illumination Using Two Virtual Spherical Gaussian Lights-Square Enix论文

    博主实现(in Unity3d 5) used one spotlight 史克威尔效果展示(夜光引擎?) 博主近期渲染:最近用unity5弄的一些渲染 ---- by wolf96  http:// ...

  8. 《C程序设计语言现代方法》第5章 选择语句

    关系运算符的优先级低于算术运算符,关系运算符都是左结合的. 判等运算符的优先级低于关系运算符,判等运算符也是左结合的. 逻辑运算符将任何非零值操作数作为真值来处理,同时将任何零值操作数作为假值来处理. ...

  9. git diff old mode 100755 new mode 100644

    755 vs 644 在linux下载了Qt的软件仓库,拷贝了一份到windows下.在 msysgit 下,发现所有的文件都被修改了. 用 git diff 查看,发现是: $ git diff u ...

  10. Java NIO使用及原理分析(三)

    在上一篇文章中介绍了缓冲区内部对于状态变化的跟踪机制,而对于NIO中缓冲区来说,还有很多的内容值的学习,如缓冲区的分片与数据共享,只读缓冲区等.在本文中我们来看一下缓冲区一些更细节的内容. 缓冲区的分 ...