Java 我可以在HQL查询中选择null作为列值吗?

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

我需要一个有三列的列表。第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论坛上的线程似乎暗示这是一个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 ...