通过任何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查询返回相应的布尔值?
答案 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 )。