我正在使用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
没有人有这个错误?
答案 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()
仍然有效...