Hibernate принимает аргументы в HQL-запросах, где их нет - PullRequest
2 голосов
/ 16 июня 2011

Почему Hibernate жалуется на следующий запрос:

  public Set<Long> findImageVariantIdsWithOutOfBoundsDimension() {
    final StringBuilder queryBuilder = new StringBuilder();
    queryBuilder.append("select id from ImageVariant where ");
    // imageVariantType is something like R_110X75 with 110 being max x.
    // cast(substring( extracts 110.
    queryBuilder.append("dimensionX > cast(substring(imageVariantType, 3, locate('X', imageVariantType) - 3), int) ");
    queryBuilder.append("or ");
    // imageVariantType is something like R_110X75 with 75 being max y.
    // cast(substring( extracts 75.
    queryBuilder.append("dimensionY > cast(substring(imageVariantType, locate('X', imageVariantType) + 1), int)");
    final Query query = getEntityManager().createQuery(queryBuilder.toString());
    @SuppressWarnings("unchecked")
    final Set<Long> result = new HashSet<Long>(query.getResultList());
    return result;
  }

Предупреждение: Function template anticipated 3 arguments, but 2 arguments encountered.Однако мой запрос не содержит ни токенов, ни аргументов.Поскольку cast является специфичной для Hibernate функцией (без преобразования строки в int в JPQL), я предполагаю, что это проблема HQL.

Когда я отлаживаю TemplateRenderer в Hibernate, я вижу, что список внутренних аргументов равен ['X', imagevaria0_.imagevarianttype].

Ответы [ 2 ]

3 голосов
/ 03 июня 2015

Это в основном предупреждение Hibernate о том, что некоторая функция SQL вызывается не со всеми допустимыми параметрами.В вашем случае это функция LOCATE.Синтаксис этой функции: LOCATE(string1, string 2, [start]), где start - это необязательный параметр, который указывает индекс первого символа, с которого начинается поиск.

В вашем случае вы вызываете эту функцию как locate('X', imageVariantType), передавая только два параметра вместо максимально допустимых 3.Класс Hibernate TemplateRenderer обнаруживает это и генерирует предупреждающее сообщение, которое вы видите.

Я поднял ошибку с командой Hibernate, чтобы уменьшить серьезность этого сообщения (поскольку оно непрекратить работу запроса в большинстве случаев) или лучше выполнить проверку, чтобы предупреждение не генерировалось в случаях, которые действительны для данной функции SQL.

Как и для всех, кто сталкивался с подобной проблемойэто предупреждение можно просто проигнорировать, если запрос работает нормально.

1 голос
/ 16 июня 2011

Когда вы знали, что это специфическая функция гибернации, почему вы создаете запрос с использованием JPA?

Попробуйте получить сеанс гибернации и создать для него запрос.Вы можете получить сеанс гибернации, используя

Session session = (Session) em.getDelegate();

EDIT : getEntityManager (). CreateQuery (queryBuilder.toString ());предполагает, что переданная вами строка запроса соответствует JPQL?Вы не должны использовать специфические особенности HQL в этом.Вам нужно получить сеанс HQL вместо диспетчера сущностей JPA для создания запроса.

EDIT : я пробовал это, и у меня все работает нормально.Моя конфигурация - JPA 2.0 с Hibernate 3.6.0 и MySQL 5.1.28.Какая у вас конфигурация?-

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...