4

通过任何 SQL 客户端运行以下命令

SELECT FALSE, TRUE;

返回

f, t

但是这个 SQL 查询:

SQLQuery qry = session.createSQLQuery("SELECT FALSE, TRUE;");
Object[] result = (Object[]) qry.uniqueResult();

返回一个包含两个布尔对象的 Object 数组:

[false, false]

我正在使用带有休眠功能的 postgres 9.0-801.jdbc4。

如何通过休眠 sql 查询返回适当的布尔值?

4

1 回答 1

3

尝试在映射文件中更改布尔属性的定义:

<property name="someBoolean" column="SOME_COLUMN" type="true_false"></property>

或者如果您使用注释添加这个:

@Type(type="true_false")

这应该会有所帮助,因为默认情况下休眠将布尔属性映射为 BIT 而不是 CHAR(1),我认为这就是您遇到此类问题的原因。(查看休眠映射类型)。

编辑:

如果您需要使用 SQLQuery 选择布尔值(作为分隔值而不是实体字段),您可以使用这种方法:

SQLQuery q = session.createSQLQuery("SELECT FALSE a, TRUE b;");
q.addScalar("a", new TrueFalseType());
q.addScalar("b", new TrueFalseType());

Object[] result = (Object[]) q.uniqueResult();

正如您在这种情况下看到的,您需要显式定义获取值的类型,以便 hibernate 可以正确转换它。我在 MySQL 中测试了这种方法并且一切正常(除了在我的情况下我指定类型BooleanType()因为 MySQL 使用布尔值作为 1/0)。

Hibernate 使用三种布尔格式:

1) “Y/N” -> CHAR(1) ansi sql 类型 -> “yes_no” 休眠类型 -> YesNoType 类;

2) "T/F" -> CHAR(1) -> "true_false" 休眠类型 -> TrueFalseType 类;

3)“1/0”->BIT ansi sql类型->“boolean”休眠类型->BooleanType类;

因此,您需要为您的数据库选择正确的类型(据我了解,正如我在示例中所写,您应该使用TrueFalseType)。

于 2012-08-05T07:09:10.247 回答