修改代码以避免hibernate4弃用警告的最佳方法

时间:2013-03-28 15:01:35

标签: hibernate

从hibernatte3升级到hibernate4后,旧的项目代码会抛出警告消息:

org.hibernate.hql.internal.ast.HqlSqlWalker [HqlSqlWalker.java:929] [DEPRECATION] Encountered positional parameter near line 1, column 56.  Positional parameter are considered deprecated; use named parameters or JPA-style positional parameters instead.

答案可以从链接中找到:

  1. How to fix a Hibernate query with deprecation warnings?
  2. https://hibernate.atlassian.net/browse/HHH-7023
  3. 但我想知道修改以下代码以避免此警告的最佳方法是什么?

    StringBuffer hql = new StringBuffer("from Record where 1=1");
    List<Object> params = new ArrayList<Object>();
    if (subject!= null && subject.trim().length() > 0) {
        hql.append(" and subjectlike ?");
        params.add("%" + subject.trim() + "%");
    }
    if (startDate != null) {
        hql.append(" and createTime> ?");
        params.add(startDate);
    }
    if (endDate != null) {
        hql.append(" and createTime< ?");
        params.add(endDate);
    }
    Query query = getSession().createQuery(hql);
    if (params.length > 0) {
       for (int i = 0, length = params.length; i < length; i++)
            query.setParameter(i, params.get(i));
    }
    List result = query.list();
    

    <小时/> ==&gt; update20130401,通过在每个参数标记'?'后添加订单号将HQL更改为JPQL样式:

    //first, fomat HQL to JPQL style
    private String fomatHQL(CharSequence queryString) {     
                StringBuffer buffer = new StringBuffer(queryString);
                int start = 0;
                int order = 0;
                while ((start = buffer.indexOf("?", start + 1)) > 0) {
                    buffer.insert(start + 1, order);
                    order++;
                }
                return buffer.toString();
    
        }
    // second, create Query
    // third, set parameters
    protected void setParameterList(Query query, Object[] params) {
            if (params != null && params.length > 0) {
                for (int i = 0, length = params.length; i < length; i++)
                    query.setParameter(i + "", params[i]);
            }
        }
    

1 个答案:

答案 0 :(得分:3)

    StringBuilder hql = new StringBuilder("from Record where 1=1");
    Query query = getSession().createQuery(hql);
    if (subject!= null && subject.trim().length() > 0) {
        hql.append(" and subjectlike :subject");
        query.setParameter("subject", "%" + subject.trim() + "%");
    }
    if (startDate != null) {
        hql.append(" and createTime> :startDate");
        query.setParameter("startDate", startDate);
    }
    if (endDate != null) {
        hql.append(" and createTime< :endDate");
        query.setParameter("endDate",endDate);
    }
    List result = query.list();

首选StringBuilderStringBuffer,因为这个最后一个是同步的,所以性能较差,除非你在并发的上下文中(这里不是这种情况)