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/
相关推荐
赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...
赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...
赠送jar包:spring-data-jpa-2.0.9.RELEASE.jar; 赠送原API文档:spring-data-jpa-2.0.9.RELEASE-javadoc.jar; 赠送源代码:spring-data-jpa-2.0.9.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-data-jpa...
hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码 hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码
hibernate-jpa-2.0-api-1.0.1.Final.jar hibernate-search-4.2.0.Final.jar hibernate-search-analyzers-4.2.0.Final.jar hibernate-search-engine-4.2.0.Final.jar hibernate-search-orm-4.2.0.Final.jar hibernate...
赠送jar包:spring-data-jpa-2.0.9.RELEASE.jar; 赠送原API文档:spring-data-jpa-2.0.9.RELEASE-javadoc.jar; 赠送源代码:spring-data-jpa-2.0.9.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-data-jpa...
hibernate-jpa-2.0-api-1.0.1.Final-sources.jar hibernate jpa 源代码
列如:hibernate-core-5.1.0.Final.jar hibernate-ehcache-5.1.0.Final.jar hibernate-entitymanager-5.1.0.Final.jar hibernate-envers-5.1.0.Final.jar hibernate-c3p0-5.1.0.Final.jar hibernate-jpa-2.1-api-...
`hibernate-jpa-2.1-api-1.0.0.final.jar`是Hibernate对JPA 2.1规范的实现库,它使得开发者能够使用Hibernate的高效功能同时遵循JPA规范。 **1. Hibernate与JPA的关系** Hibernate最初作为一个独立的ORM框架,后来...
hibernate-jpa-2.0-api-1.0.1.Final.jar
hibernate-jpa-2.1-api-1.0.0.Final.jar官方下载,请放心使用
java运行依赖jar包
本篇文章将重点围绕“hibernate-jpa-2.1-api-1.0.0.final-sources.jar.zip”这一压缩包,深入解析Hibernate对JPA 2.1 API的实现,以期帮助读者深入理解其内部机制。 JPA(Java Persistence API)是Java平台上的一个...
java.lang.NoClassDefFoundError: javax/persistence/spi/ProviderUtil 或javax/persistence/entitylistener问题
这个源码包"hibernate-jpa-2.0-api-1.0.1.Final-sources"包含了完整的源代码,可以帮助我们深入了解其内部机制,从而更好地应用在实际项目中。 1. **JPA简介**:Java Persistence API(JPA)是Java平台上的一个标准...
用SpringBoot + Spring Data JPA操作数据库 项目启动的时候 报了一个错 SpringBoot的版本是2.2.6.RELEASE org.springframework.beans.factory.BeanCreationException: Error creating bean with name '...
hibernate-jpa-2.0-api-1.0.1.Final.jar hibernate-search-4.2.0.Final.jar hibernate-search-analyzers-4.2.0.Final.jar hibernate-search-engine-4.2.0.Final.jar hibernate-search-orm-4.2.0.Final.jar hibernate...
这两个模块的 jar 文件,`spring-data-commons-1.7.2.RELEASE.jar` 和 `spring-data-jpa-1.5.2.RELEASE.jar`,包含了它们各自的功能实现和依赖。在实际项目中,将这些 jar 文件添加到类路径,就可以利用 Spring Data...