hibernate sql查询没有正确映射布尔值?

时间:2012-08-05 03:37:46

标签: hibernate postgresql

通过任何SQL客户端运行以下内容

SELECT FALSE, TRUE;

返回

f, t

但是这个SQL查询:

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

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

[false, false]

我正在使用postgres 9.0-801.jdbc4和hibernate。

如何通过hibernate sql查询返回相应的布尔值?

1 个答案:

答案 0 :(得分:3)

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

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

或者如果您使用注释,请添加以下内容:

@Type(type="true_false")

这应该有帮助,因为默认情况下hibernate将布尔属性映射为BIT而不是CHAR(1),我认为这就是为什么你有这样的问题。 (看hibernate mapping types)。

修改

如果你需要使用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” - &gt; CHAR(1)ansi sql type - &gt; “yes_no”hibernate类型 - &gt; YesNoType类;

2)“T / F” - &gt; CHAR(1) - &gt; “true_false”hibernate类型 - &gt; TrueFalseType类;

3)“1/0” - &gt; BIT ansi sql类型 - &gt; “boolean”hibernate类型 - &gt; BooleanType类;

所以你需要为你的数据库选择正确的类型(正如我所理解的那样,并且在我的例子中你应该使用 TrueFalseType )。