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.
Ответ можно найти по ссылкам:
- How to fix a Hibernate query with deprecation warnings?
- 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]);
}
}
Gab, спасибо! Но есть много таких кодов, и модификация будет большой работой. Точно, все они вызывают метод «Список queryByHQL (String hql, Параметры списка)», который создает запрос и устанавливает параметры. У меня есть идея, что изменение стиля HQL на JPQL путем добавления номера заказа после каждого знака параметра «?», Поэтому его не нужно менять для вызова других методов setParameter. Как ты думаешь? –
Не могли бы вы отправить сообщение queryByHQL content content – Gab
Gab, я добавил основную часть метода queryByHQL в конце вопроса. –