错误:在Java使用getBoolean时无法转换为内部表示形式。 - JAVA,ORACLE

3
我在使用getBoolean获取Oracle中char[1 char]数据类型时遇到了错误,提示无法转换为内部表示。当记录为数字(0-9)时操作成功,但是当记录为字符如T、F(True、False)或Y、N(YES、NO)时,错误就会发生。以下是我的代码。
   List<TestList> objects = query
                    .setResultTransformer(Transformers.aliasToBean(TestList.class))
                    .setFirstResult(start).setMaxResults(count).list();

在TestList.Class中,我有一个布尔类型的setter/getter,如下所示:

Boolean installment;
public Boolean getInstallment() {
    return installment;
}

public void setInstallment(Boolean installment) {
    this.installment = installment;
}

以下是错误的完整日志:
ERROR Throwable:84 - Caused by: java.sql.SQLException: Fail to convert to internal representation 2017-09-14 20:10:58 ERROR Throwable:84 - at oracle.jdbc.driver.CharCommonAccessor.getBoolean(CharCommonAccessor.java:185) 2017-09-14 20:10:58 ERROR Throwable:84 - at oracle.jdbc.driver.T4CCharAccessor.getBoolean(T4CCharAccessor.java:697) 2017-09-14 20:10:58 ERROR Throwable:84 - at oracle.jdbc.driver.OracleResultSetImpl.getBoolean(OracleResultSetImpl.java:640) 2017-09-14 20:10:58 ERROR Throwable:84 - at oracle.jdbc.driver.OracleResultSet.getBoolean(OracleResultSet.java:390)
顺便提一下,我使用的是 Oracle 11.2.0.4.0,Java 7 和 Hibernate 4.3.9。
请帮忙解决问题,谢谢。 对于糟糕的语法表示抱歉 :)

@MaciejKowalski 当我尝试跟踪和调试时,错误发生在setResultTransformer(Transformers.aliasToBean(TestList.class))中,并且我无法查看此函数内部的代码,因为它在hibernate-core-4.3.9.Final.jar文件中。 - Fred
1个回答

4

选择自定义转换器:

@Converter
public class BooleanConverter implements AttributeConverter<Boolean, String>{
    @Override
    public String convertToDatabaseColumn(Boolean value) {
        if (Boolean.TRUE.equals(value)) {
            return "1";
        } else {
            return "0";
        }
    }
    @Override
    public Boolean convertToEntityAttribute(String value) {
        return "1".equals(value);
    }
}

然后在你的实体中:
@Convert(converter=BooleanConverter.class)
private Boolean installment;

转换器API来自javax.persistence包。您必须使用JPA 2.1+。


太好了,很高兴它能这样。 - Maciej Kowalski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接