为什么String需要Hibernate JPQL Type Cast

时间:2011-12-09 07:22:00

标签: hibernate playframework jpa-2.0 jpql

我正在使用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 个答案:

答案 0 :(得分:4)

您是否在conf / application.conf中启用了postgresql数据库方言?

jpa.dialect = org.hibernate.dialect.PostgreSQLDialect

答案 1 :(得分:2)

尝试按(?1)替换,如下所示:

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

我有类似的查询,工作得很好。我假设ApplicationUser中的字段 userName 是String类型(以防万一!)

另外,正如Dominik建议的那样,检查 jpa.dialect 是否设置为自动发现或PosgreSQL。

答案 2 :(得分:1)

我遇到了完全相同的问题,1.2.4。

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

获得与您完全相同的投射错误,因此我必须将其替换为(感谢Pere)

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

有趣的是,

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

仍然有效...