2

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. 非推奨の警告で Hibernate クエリを修正するには?
  2. https://hibernate.atlassian.net/browse/HHH-7023

しかし、この警告を回避するために次のコードを変更する最良の方法は何ですか?

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();


==>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]);
        }
    }
4

1 に答える 1

4
    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

于 2013-03-28T15:22:39.053 に答える