Почему Hibernate JPQL Type Cast необходим для String - PullRequest
4 голосов
/ 09 декабря 2011

Я использую Play! Рамки для небольшого приложения. В модели у меня есть следующий запрос:

public static ApplicationUser getByUserName(String userName) {
    return ApplicationUser.find("SELECT u FROM ApplicationUser u WHERE u.userName = ?", userName).first();
}

Это прекрасно работает с DB H2 в памяти, но когда я использую Postgres, я получаю следующую ошибку:

22:57:10,371 WARN  ~ SQL Error: 0, SQLState: 42883
22:57:10,371 ERROR ~ ERROR: operator does not exist: character varying = bytea
  Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
  Position: 167

Когда я приведу параметр как:

ApplicationUser.find("SELECT u FROM ApplicationUser u WHERE u.userName = CAST(? AS string)", userName).first()

Тогда это работает. Но зачем это нужно? Это может быть ошибка Hibernate?

Обновление: Я понизил версию игры с 1.2.4 до 1.2.3, и теперь она работает. Я думаю, что проблема заключается в поставляемом драйвере postgres jdbc, вероятно.

Обновление II : проблема все еще не решена. Я снова получаю ту же ошибку для запроса:

ApplicationRole.find("byName", name).first();

Ошибка:

JPAQueryException occured : Error while executing query SELECT u FROM ApplicationUser u WHERE u.userName = ?: ERROR: operator does not exist: character varying = bytea   Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.

В application.conf У меня есть:

jpa.dialect = org.hibernate.dialect.PostgreSQLDialect

Ни у кого нет этой ошибки?

Ответы [ 3 ]

4 голосов
/ 09 декабря 2011

Вы включили диалект базы данных postgresql в conf / application.conf?

jpa.dialect = org.hibernate.dialect.PostgreSQLDialect

2 голосов
/ 11 декабря 2011

Попробуйте заменить ? на (? 1) как в:

public static ApplicationUser getByUserName(String userName) {
    return ApplicationUser.find("SELECT u FROM ApplicationUser u WHERE u.userName = (?1)", userName).first();
}

У меня похожий запрос, и он отлично работает. Я предполагаю, что поле userName в ApplicationUser имеет тип String (на всякий случай!)

Также, как предложил Доминик, убедитесь, что для вашего jpa.dialect установлено автоматическое обнаружение или PosgreSQL.

1 голос
/ 17 января 2012

У меня точно такая же проблема, 1.2.4.

User.find("byEmail", email).first()

получает ту же самую ошибку приведения, что и вы, поэтому мне пришлось заменить ее на (спасибо Пере)

User.find("email = (?1)", email).first()

Интересно, что

User.find("byEmailAndPassword", email, password).first()

все еще работает ...

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