2013-03-28 5 views
1

После обновления hibernatte3 до hibernate4, старый код проекта бросает предупреждающие сообщения:Лучший способ модификации кода, чтобы избежать 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

Но мне интересно, как лучше всего изменить следующий код, чтобы избежать этого предупреждения?

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

ответ

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

Предпочитают StringBuilder к StringBuffer, как это последнее синхронизируется и поэтому менее эффективен, если вы не находитесь в параллельном контексте (не здесь)

+0

Gab, спасибо! Но есть много таких кодов, и модификация будет большой работой. Точно, все они вызывают метод «Список queryByHQL (String hql, Параметры списка)», который создает запрос и устанавливает параметры. У меня есть идея, что изменение стиля HQL на JPQL путем добавления номера заказа после каждого знака параметра «?», Поэтому его не нужно менять для вызова других методов setParameter. Как ты думаешь? –

+0

Не могли бы вы отправить сообщение queryByHQL content content – Gab

+0

Gab, я добавил основную часть метода queryByHQL в конце вопроса. –

Смежные вопросы