将hibernate与Mysql一起使用并进行测试我正在使用HSQL。 我们使用基于@Where子句的过滤有许多集合。例如:
@Column(name="CONDITIONS")
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="CATEGORIES_PKEY")
@Cascade({org.hibernate.annotations.CascadeType.DELETE})
@Where(clause="deleted_flag = 'false'")
public List<CategoryConditionMapping> getMappedConditions() {
return mappedConditions;
}
在 MySQL ,
这有效:
@Where(clause="deleted_flag = 'false'")
这不起作用:
@Where(clause="deleted_flag = FALSE")
HSQL ,
这有效:
@Where(clause="deleted_flag = FALSE")
这不起作用:
@Where(clause="deleted_flag = 'false'")
只有在添加自定义HSQLDialect
之后,Hsql才开始支持@Where(子句=&#34; deleted_flag = FALSE&#34;):
public class CustomHSQLDialect extends HSQLDialect {
public CustomHSQLDialect() {
super();
registerKeyword("true");
registerKeyword("false");
registerKeyword("unknown");
}
}
尝试为此方言注册更多关键字,例如
registerKeyword("'false'");
registerKeyword("'true'");
但它没有任何效果。 HSQL在尝试使用@Where时抛出异常(子句=&#34; deleted_flag =&#39; false&#39;&#34;)
引起:org.hsqldb.HsqlException:数据异常:转换的无效字符值 在org.hsqldb.error.Error.error(未知来源) 在org.hsqldb.error.Error.error(未知来源) 在org.hsqldb.Scanner.convertToBit(未知来源) at org.hsqldb.types.BitType.castOrConvertToType(Unknown Source) at org.hsqldb.types.BitType.castToType(Unknown Source) 在org.hsqldb.ExpressionOp.getCastExpression(未知来源) at org.hsqldb.ExpressionLogical.resolveTypesForComparison(Unknown Source) at org.hsqldb.ExpressionLogical.resolveTypes(未知来源) at org.hsqldb.ExpressionLogical.resolveTypes(未知来源) 在org.hsqldb.QuerySpecification.resolveExpressionTypes(未知来源) 在org.hsqldb.QuerySpecification.resolveTypesPartOne(未知来源) 在org.hsqldb.QueryExpression.resolve(未知来源) at org.hsqldb.ParserDQL.compileCursorSpecification(未知来源) 在org.hsqldb.ParserCommand.compilePart(未知来源) 在org.hsqldb.ParserCommand.compileStatement(未知来源) 在org.hsqldb.Session.compileStatement(未知来源) 在org.hsqldb.StatementManager.compile(未知来源) 在org.hsqldb.Session.execute(未知来源)
HSQL正在尝试将字符串转换为布尔值并失败。
我们如何让HSQL理解字符串&#39; false&#39;作为一点,或者我们如何使@Where子句通用在HSQL和MySQL上愉快地工作
答案 0 :(得分:1)
也许您没有为该列使用正确的类型。在MySQL中使用布尔值的最佳方法是使用BIT或TINYINT,并在Entity类中将其定义为&#39; boolean&#39;。如果它不起作用,您甚至应该像这样添加@Type:
@Column(name="DELETED_FLAG")
@Type(type = "org.hibernate.type.NumericBooleanType")
public boolean deleted_flag = true;
然后hibernate会知道如何处理这个属性。查看本文的mysql数据类型: http://dev.mysql.com/doc/connector-j/en/connector-j-reference-type-conversions.html