繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM