Java 我可以在HQL查询中选择null作为列值吗?
我需要一个有三列的列表。第1列和第3列具有值,而第2列为空。 我可以通过HQL查询完成吗 我需要这样的东西:Java 我可以在HQL查询中选择null作为列值吗?,java,hibernate,hql,orm,Java,Hibernate,Hql,Orm,我需要一个有三列的列表。第1列和第3列具有值,而第2列为空。 我可以通过HQL查询完成吗 我需要这样的东西: select id, null, name from MyClass 如果MyClass和基础表只有两个属性/列,即“id”和“name”AFAIK,那么您的查询将不会返回预期的结果,它将只返回null之前的(id)。但是,以下方法可行 select id as first, '', name from MyClass 我不知道这是一个bug还是一个不受支持的特性(Hibernate
select id, null, name from MyClass
如果MyClass和基础表只有两个属性/列,即“id”和“name”AFAIK,那么您的查询将不会返回预期的结果,它将只返回
null
之前的(id
)。但是,以下方法可行
select id as first, '', name from MyClass
我不知道这是一个bug还是一个不受支持的特性(Hibernate论坛上的线程似乎暗示这是一个bug)
我不确定我是否理解您为什么需要它(可以选择一个
select new
表达式吗?),但恐怕您必须在这里使用本机SQL。另一个似乎可行的选项(在DB2、MySQL、Oracle和SQL Server上测试):
您可以对Hibernate方言进行子类化,并使用自定义函数对其进行抽象:
registerFunction("always_null",
new SQLFunctionTemplate(Hibernate.STRING, "cast(null as char)"));
然后在HQL中使用此选项:
select id, always_null(), name from ...
您也可以尝试删除字符(null)。它在构造函数new Foo(id、name、attr3)中对HQL-Oracle运行良好,其中attr3-String value可以使用nullif()
函数生成null
它接受两个论点。如果参数相等,它将返回
null
值。“从MyClass中选择新对象(id、null、名称)”不起作用well@SJP是的,我知道,但我不是这个意思。我的意思是使用new Foo(id,name)
并在构造函数中将第三个属性设置为null
。噢,我第一次尝试时没有抓住你的重点,现在明白了。在null非常关键的情况下,我们可以阻止您,但它的频繁使用会使实体类变得混乱。顺便说一句,对于我目前的情况,你的第一个建议很有魅力。很有趣!你还在用cast(null为char)
获得一个“真实的”null
,还是你得到了一个'null'
?酷!在hibernate中没有通用解决方案的情况下,它可以拯救我们的皮肤。好消息是,我们不必玩Java对象。您救了我,非常感谢。我认为这是最干净的解决方案。使用NULLIF(1,1)
效果很好:)
select id, always_null(), name from ...