Hibernate @Where子句在HSQL和MySQL之间不一致

时间:2014-11-07 11:49:53

标签: 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_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上愉快地工作

1 个答案:

答案 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