Следующий 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?
Почему работает "верхняя" функция, но не "левая" функция?
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.