gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:35:56 27 4
gpt4 key购买 nike

将 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 抛出异常

Caused by: org.hsqldb.HsqlException: data exception: invalid character value for cast at org.hsqldb.error.Error.error(Unknown Source) at org.hsqldb.error.Error.error(Unknown Source) at org.hsqldb.Scanner.convertToBit(Unknown Source) at org.hsqldb.types.BitType.castOrConvertToType(Unknown Source) at org.hsqldb.types.BitType.castToType(Unknown Source) at org.hsqldb.ExpressionOp.getCastExpression(Unknown Source) at org.hsqldb.ExpressionLogical.resolveTypesForComparison(Unknown Source) at org.hsqldb.ExpressionLogical.resolveTypes(Unknown Source) at org.hsqldb.ExpressionLogical.resolveTypes(Unknown Source) at org.hsqldb.QuerySpecification.resolveExpressionTypes(Unknown Source) at org.hsqldb.QuerySpecification.resolveTypesPartOne(Unknown Source) at org.hsqldb.QueryExpression.resolve(Unknown Source) at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source) at org.hsqldb.ParserCommand.compilePart(Unknown Source) at org.hsqldb.ParserCommand.compileStatement(Unknown Source) at org.hsqldb.Session.compileStatement(Unknown Source) at org.hsqldb.StatementManager.compile(Unknown Source) at org.hsqldb.Session.execute(Unknown Source)

HSQL 正在尝试将字符串转换为 boolean 值,但失败。

如何让 HSQL 将字符串“false”理解为一点,或者如何使 @Where 子句通用以在 HSQL 和 MySQL 上正常工作

最佳答案

也许您没有使用正确的列类型。在 MySQL 中使用 boolean 值的最佳方法是使用 BIT 或 TINYINT,并在实体类中将其定义为“boolean 值”。如果它不起作用,你甚至应该添加@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

关于java - Hibernate @Where 子句在 HSQL 和 MySQL 之间不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26800618/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com