Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate@Where子句在HSQL和MySQL之间不一致_Java_Mysql_Hibernate_Hsqldb - Fatal编程技术网

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

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

将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;
}
这不起作用:

@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。关于我的问题的另一个评论,我已经回答了。现在我更新了我的问题的更多细节