Некоторые функции SQL не работают в HQL

1

Следующий sql действителен, когда я запускаю его непосредственно на PostgreSql, а также в HQL в Hibernate:

sql = "update Address set city = upper(city)"

HQL: session.createQuery(sql).executeUpdate()

Однако, когда я пытаюсь использовать функцию sql left (String, number) следующим образом:

sql = "update Address set city = left(city,7)"

Он отлично работает непосредственно на PostgreSql, но генерирует это исключение в Hibernate:

org.hibernate.hql.ast.QuerySyntaxException: unexpected token: left near line 1

Я правильно набрал диалект:

props.put("hibernate.dialect", PostgreSQLDialect.class.getName());

Как я могу заставить HQL вести себя так же, как SQL?

Почему работает "верхняя" функция, но не "левая" функция?

  • 0
    Я не вижу, как это связано с sql-сервером (и, следовательно, его тегом) (но, конечно, я могу что-то упустить)
Теги:
sql-server
hibernate

1 ответ

1
Лучший ответ

HQL поддерживает верхнюю функцию, но не поддерживает левую функцию. Вы должны использовать эквивалентную функцию подстроки, которая принимает три аргумента:

"update Address set city = substring(city,1,7)"

Вы также можете вычислить подстроку с уровня Java, создав запрос таким образом:

"update Address set city = :city"

И тогда вы можете запустить запрос таким образом:

session.createQuery(sql).setParameter("city", newCity).executeUpdate();

Где город - подстрока, созданная следующим образом:

  newCity = city.substring(1,7)

Более простой (и менее Hibernateish) способ заключается в использовании функции creatNativeQuery вместо createQuery, вам не придется делать вычисления подстроки таким образом. Этот метод запускается так же, как если бы вы использовали синтаксис PostgreSQL.

  • 0
    Niemand, я имел ввиду, что sql обновляет каждый город в таблице.
  • 0
    Он обновляет каждый город в таблице. Не могли бы вы разработать свою проблему?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню