gut*_*tch 7 java hibernate boolean hsqldb
我想@Where在Hibernate中使用注释来删除已被该对象上的布尔属性标记为"已删除"的对象.例如,以下内容应该防止Hibernate加载任何已删除的地址:
@OneToMany(mappedBy="contact")
@Where(clause="deleted=FALSE")
private Set<Address> addresses;
Run Code Online (Sandbox Code Playgroud)
但是当我使用类似的子句时,deleted=FALSEHibernate将通过在其前面加上表名来破坏布尔文字,这会导致查询失败.例如:
select ... from address address0_ where ( address0_.deleted=address0_.FALSE) and address0_.contact_id=?
Run Code Online (Sandbox Code Playgroud)
我所期待的是(address0_.deleted=FALSE)代替的东西(address0_.deleted=address0_.FALSE).
有没有办法指定@Where子句或配置Hibernate以正确输出布尔值?
PS.请注意,某些数据库可以将布尔值指定为字符串文字,如下所示:
@Where(clause="deleted='FALSE'")
Run Code Online (Sandbox Code Playgroud)
这将被转换为(address0_.deleted='FALSE')可以正常工作,例如,PostgreSQL.但是我在这个项目中使用HSQLDB,而HSQLDB似乎不支持布尔字符串文字.在HSQL上,使用时会出现以下异常deleted='FALSE':
org.hsqldb.HsqlException: data exception: invalid character value for cast
我发现了关于这个的错误报告已经有六年多没有解决了!关于这个问题,Hibernate问题跟踪器有HHH-1587,HHH-2775和ANN-647.
解决方案是创建一个自定义的Dialect类,它注册true,false并unknown作为关键字(这些是SQL规范中的官方布尔文字).这会导致Hibernate将它们识别为关键字,从而停止为它们添加前缀,就像它们是列一样.
这是我的自定义Dialect类,它为我解决了这个问题:
public class ImprovedHSQLDialect extends HSQLDialect {
public ImprovedHSQLDialect() {
super();
registerKeyword("true");
registerKeyword("false");
registerKeyword("unknown");
}
}
Run Code Online (Sandbox Code Playgroud)
一旦使用这种方言,@Where(clause="deleted=FALSE")就能正常工作.
| 归档时间: |
|
| 查看次数: |
1935 次 |
| 最近记录: |