H2 Oracle模式-“BOOLEAN”和“INTEGER”类型的值不可比较

wbrvyc0a  于 2023-11-17  发布在  Oracle
关注(0)|答案(1)|浏览(143)

我正在使用Sping Boot 和Hibernate,当在H2(2.1.210)中运行我的测试时,我得到了一个Values of types "BOOLEAN" and "INTEGER" are not comparable错误。这是由于@Query将布尔值与整数进行比较。这在Oracle中正确工作。

@Query("FROM TABLE_NAME t WHERE t.value= 0")
public List<Example> findExample();

字符串
t.value的类型为Boolean
我发现其他问题也有类似的问题,建议添加这个。

import org.hibernate.dialect.H2Dialect;

public class H2DialectExtended extends H2Dialect {

    @Override
    public String toBooleanValueString(boolean bool) {
        return bool ? "TRUE" : "FALSE";
    }
}


但是这不起作用。
我该怎么解决这个问题?
H2/休眠设置-application.yml

spring:

  driver:
    class-name: org.h2.Driver

  datasource:
    platform:
      url: jdbc:h2:mem:project_name;DB_CLOSE_ON_EXIT=FALSE;MODE=Oracle;
      username: username
      password:

  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.H2Dialect

bqucvtff

bqucvtff1#

如果这个@Query("FROM TABLE_NAME t WHERE t.value= 0")正是你所拥有的,那么这意味着这是JPQL语言,而不是SQL语言。你比较它的方式,就像与此相关的实体有一个整数字段,这不应该是这样。Java字段应该是boolean
那么这应该是@Query("FROM TABLE_NAME t WHERE t.value= false"),它将能够为Oracle和H2工作。
默认情况下,当你使用像Hibernate这样的ORM供应商并且你有一个Oracle数据库时,实体字段boolean value将在数据库级别与Number(1)类型匹配,其中0 == false1 == true在ORM层。
其中一种方法是将您的实体字段设置为以下内容:

@Type(type= "org.hibernate.type.NumericBooleanType")
private Boolean value;

字符串

相关问题