Java JPA 布尔字段数据库

Posted

技术标签:

【中文标题】Java JPA 布尔字段数据库【英文标题】:Java JPA Boolean Field Database 【发布时间】:2018-10-05 13:47:54 【问题描述】:

我的模型中有一个这样创建的属性:

 public class Client 
    private Boolean supervisor;
 

使用 Criteria 进行查询时,例如:p4 = cb.isTrue (root.get ("supervisor")),JPA 返回错误 client0_.supervisor = 1 - ERROR: conversion error of string "1" [SQLState :22018,ISC 错误代码:335544334]。我该如何解决这个问题?

我的 RDBMS 是 Firebird,主管列的类型是 BOOLEAN。

【问题讨论】:

数据库中列的类型是什么?如果它是 varchar,则需要一个转换器将其转换为布尔值。 (或者改变列的类型) 我的 RDBMS 是 Firebird,主管列的类型是 BOOLEAN。 jpa在数据库字段中读写正确,问题只在Criteria的where 【参考方案1】:

根据给出的信息很难判断,但可能发生的情况是您的 JPA 实现是休眠的,而休眠 可能 没有方言Firebase,因此您使用的是其他方言(如 H2 方言),而这种方言可能无法正确处理布尔数据类型。

您需要首先验证是否确实如此,如果是这样,您将需要找到或实施一种用于 Firebase 的 Hibernate 方言来解决此问题。这肯定比调整设置要多,但也不需要付出巨大的努力,请看这里的示例:

HSQL + Hibernate Exception: Wrong column type: Found: double, expected: float

【讨论】:

Hibernate 5 似乎支持 Firebird。但是,OP 可能仍在使用错误的方言。 docs.jboss.org/hibernate/orm/5.0/manual/en-US/html/… 我已经在我的 persistence.xml 中使用了: 好吧,那么也许方言是蹩脚的,它不能很好地处理布尔值,所以你可能要考虑修复它。这并非闻所未闻,这正是我链接到的帖子对 HSQL 方言所做的事情,该方言不能与双精度和浮点数一起正常工作。但是等几天看看是否有人有更好的主意。或者试试 Firebird 以外的其他数据库,看看问题是出在 Firebird 及其方言上,还是出在你的东西上。【参考方案2】:

我已经设法解决了这个问题,不是使用 Criteria,而是使用 JPQL,如下所示:

select     new Extensionista(e.id, e.name) 
from       Extensionista e 
join       e.localControle lc 
where      lc.id =: id 
and        e.cpf is not null 
and        e.status = 'T' 
and        e.supervisor = 'true'
order by   e.name

【讨论】:

以上是关于Java JPA 布尔字段数据库的主要内容,如果未能解决你的问题,请参考以下文章

使用@Query和休眠更新spring数据jpa中的布尔值

jpa-derby 布尔合并

JPA怎么判断一个字段是不是存在?

使用 JPA 和 Hibernate 将 Java 布尔值映射到 Oracle Number 列

JPQL 查询:选择一个布尔值,它是对象的两个字段的 AND

如何使用更新的 JPA 时间戳字段升级数据库?