Java Hibernate@Where子句在HSQL和MySQL之间不一致
将hibernate与Mysql结合使用,为了进行测试,我使用的是HSQL。 在许多集合中,我们使用基于@where子句的筛选。例如:Java Hibernate@Where子句在HSQL和MySQL之间不一致,java,mysql,hibernate,hsqldb,Java,Mysql,Hibernate,Hsqldb,将hibernate与Mysql结合使用,为了进行测试,我使用的是HSQL。 在许多集合中,我们使用基于@where子句的筛选。例如: @Column(name="CONDITIONS") @OneToMany(cascade=CascadeType.ALL) @JoinColumn(name="CATEGORIES_PKEY") @Cascade({org.hibernate.annotations.CascadeType.DELETE}) @Where(clause="deleted_fla
@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;
}
这不起作用:
@Where(clause="deleted_flag = FALSE")
@Where(clause="deleted_flag = 'false'")
在HSQL中
这项工作:
@Where(clause="deleted_flag = 'false'")
@Where(clause="deleted_flag = FALSE")
这不起作用:
@Where(clause="deleted_flag = FALSE")
@Where(clause="deleted_flag = 'false'")
Hsql仅在添加自定义HSQLquantial
之后才开始支持@Where(子句=“deleted_flag=FALSE”):
public class CustomHSQLDialect extends HSQLDialect {
public CustomHSQLDialect() {
super();
registerKeyword("true");
registerKeyword("false");
registerKeyword("unknown");
}
}
尝试注册此方言的更多关键字,如
registerKeyword("'false'");
registerKeyword("'true'");
但它没有任何效果。
尝试使用@Where时,HSQL引发异常(子句=“deleted_flag='false')
原因:org.hsqldb.hsqldb异常:数据异常:强制转换的字符值无效
位于org.hsqldb.error.error.error(未知来源)
位于org.hsqldb.error.error.error(未知来源)
位于org.hsqldb.Scanner.convertToBit(未知来源)
位于org.hsqldb.types.BitType.castOrConvertToType(未知源)
位于org.hsqldb.types.BitType.castToType(未知源)
位于org.hsqldb.ExpressionOp.getCastExpression(未知源)
位于org.hsqldb.ExpressionLogical.resolveTypesForComparison(未知源)
位于org.hsqldb.ExpressionLogical.resolveTypes(未知源)
位于org.hsqldb.ExpressionLogical.resolveTypes(未知源)
位于org.hsqldb.QuerySpecification.resolveExpressionTypes(未知源)
位于org.hsqldb.QuerySpecification.resolveTypesPartOne(未知来源)
位于org.hsqldb.QueryExpression.resolve(未知源)
位于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稍微理解字符串'false',或者如何让@Where子句泛化,以便在HSQL和MySQL上都能正常工作也许您没有为该列使用正确的类型。在MySQL中使用布尔值的最佳方法是使用BIT或TINYINT,在实体类中,您可以将其定义为“boolean”。如果它不起作用,你甚至应该像这样添加@Type:
@Column(name="DELETED_FLAG")
@Type(type = "org.hibernate.type.NumericBooleanType")
public boolean deleted_flag = true;
然后hibernate将知道如何处理这个属性。查看本文中的mysql数据类型:
此批注所指的实际属性是什么?它是boolean类型吗?它在集合(OneToMany)上进行注释,但deleteg_标志是一个布尔值-在where子句中对其求值,然后正确的形式将被删除_标志=false。数据库是如何创建的?它是在这两种情况下自动生成的,还是仅在使用HSQL时自动生成的?例如,使用Log4JDBC可以帮助您查看具体生成了什么样的SQL。关于我的问题的另一个评论,我已经回答了。现在我更新了我的问题的更多细节