zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    pythonday06数据类型(四)
    pythonday05数据类型(三)
    pythonday04数据类型(二)
    pythonday03数据类型(一)
    Apollo自动驾驶实践——第0讲:导论
    图论学习:生成树的Matrix-tree定理
    2020杭电多校6 Expectation
    2020牛客暑期多校第九场 B Groundhog and Apple Tree
    图论:二分图最大权匹配KM算法
    第十章 百度Apollo实战
  • 原文地址:https://www.cnblogs.com/fanshuyao/p/6227104.html
Copyright © 2011-2022 走看看