【发布时间】:2014-11-07 11:49:52
【问题描述】:
在 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'")
Hsql 开始支持@Where(clause="deleted_flag = FALSE"),只有在添加自定义HSQLDialect 之后:
public class CustomHSQLDialect extends HSQLDialect {
public CustomHSQLDialect() {
super();
registerKeyword("true");
registerKeyword("false");
registerKeyword("unknown");
}
}
尝试为该方言注册更多关键字。例如
registerKeyword("'false'");
registerKeyword("'true'");
但它没有任何作用。 HSQL 抛出异常,同时尝试使用 @Where(clause="deleted_flag = 'false'")
原因:org.hsqldb.HsqlException:数据异常:强制转换的字符值无效 在 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 上愉快地工作
【问题讨论】:
-
这个注解所指的实际属性是什么?它是布尔类型的吗?
-
它在集合(OneToMany)上被注释,但 deleteg_flag 是一个布尔值 - 它在 where 子句中被评估
-
那么正确的形式应该是deleted_flag = false。数据库是如何创建的?它是在这两种情况下自动生成的,还是仅在使用 HSQL 时自动生成?它可能会帮助您使用例如 Log4JDBC 来查看具体生成的 SQL。
标签: java mysql hibernate hsqldb