[英]Hibernate @Where clause inconsistent between HSQL and MySQL
将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(clause =“ deleted_flag = FALSE”):
public class CustomHSQLDialect extends HSQLDialect {
public CustomHSQLDialect() {
super();
registerKeyword("true");
registerKeyword("false");
registerKeyword("unknown");
}
}
尝试为该方言注册更多关键字。
registerKeyword("'false'");
registerKeyword("'true'");
但这没有任何作用。 尝试使用@Where(clause =“ deleted_flag ='false'”)时,HSQL引发异常
由以下原因引起:org.hsqldb.HsqlException:数据异常:org.hsqldb.error.Error.error(未知源)处的org.hsqldb.error.Error.error(未知源)处的强制转换的字符值无效。 org.hsqldb.types.BitType.cast的Scanner.convertToBit(未知源)org.org.hsqldb.ExpressionOp.getCastExpression(未知源)的org.hsqldb.types.BitType.castToType(未知源)的org.hsqldb.types.BitType.cast org.hsqldb.ExpressionLogical.resolveTypes(未知源)位于org.hsqldb.ExpressionLogical.resolveTypes(未知源)位于org.hsqldb.QuerySpecification.resolveExpressionTypes(未知源)位于org.hsqldb。 org.hsqldb.QueryExpression.resolve(未知源)位于org.hsqldb.ParserDQL.compileCursorSpecification(未知源)位于org.hsqldb.ParserCommand.compilePart(未知源)org.hsqldb.ParserCommand处。 org.hsqld上的compileStatement(未知源) b.Session.compileStatement(未知来源)在org.hsqldb.StatementManager.compile(未知来源)在org.hsqldb.Session.execute(未知来源)
HSQL试图将字符串转换为布尔值,但失败。
我们如何使HSQL稍微理解字符串'false'或如何使@Where子句在HSQL和MySQL上都能正常工作
也许您没有为列使用正确的类型。 在MySQL中使用布尔值的最佳方法是使用BIT或TINYINT,在Entity类中,您将其定义为'boolean'。 如果它不起作用,您甚至应该像这样添加@Type:
@Column(name="DELETED_FLAG")
@Type(type = "org.hibernate.type.NumericBooleanType")
public boolean deleted_flag = true;
然后休眠将知道如何处理此属性。 检查本文以获取mysql数据类型: http : //dev.mysql.com/doc/connector-j/en/connector-j-reference-type-conversions.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.