在Hibernate标准API中使用subselect进行空处理
我正在构建一个Hibernate标准,使用一个子选择,如下所示在Hibernate标准API中使用subselect进行空处理,hibernate,null,criteria,subquery,nvl,Hibernate,Null,Criteria,Subquery,Nvl,我正在构建一个Hibernate标准,使用一个子选择,如下所示 DetachedCriteria subselect = DetachedCriteria.forClass(NhmCode.class, "sub"); // the subselect selecting the maximum 'validFrom' subselect.add(Restrictions.le("validFrom", new Date())); // it should be in the past
DetachedCriteria subselect =
DetachedCriteria.forClass(NhmCode.class, "sub"); // the subselect selecting the maximum 'validFrom'
subselect.add(Restrictions.le("validFrom", new Date())); // it should be in the past (null needs handling here)
subselect.add(Property.forName("sub.lifeCycle").eqProperty("this.id")); // join to owning entity
subselect.setProjection(Projections.max("validFrom")); // we are only interested in the maximum validFrom
Conjunction resultCriterion = Restrictions.conjunction();
resultCriterion.add(Restrictions.ilike(property, value)); // I have other Restrictions as well
resultCriterion.add(Property.forName("validFrom").eq(subselect)); // this fails when validFrom and the subselect return NULL
return resultCriterion;
到目前为止,它工作正常,但当validFrom和subselect结果为NULL时,return语句前最后一行的限制为false
我需要的是一个版本,处理这个案件作为真实的。可能通过应用NVL或聚结或类似方法
我该怎么做
更新:--------------
带有sqlRestriction的péters思想产生了如下where子句:
...
and (
nhmcode1_.valid_from = (
select
max(sub_.valid_from) as y0_
from
nhm_code sub_
where
sub_.valid_from<=?
and sub_.lc_id=this_.id
)
or (
nhmcode1_.valid_from is null
and sub.validFrom is null
)
)
...
这反过来又导致:
ORA-00904:SUB_.VALIDFROM:ungültiger Bezeichner
错误消息的意思是“无效标识符”您可以尝试以下操作,而不是出现问题的行:
resultCriterion.add(
Restrictions.or(
Restrictions.and(
Restrictions.isNull("validFrom"),
Restrictions.sqlRestriction("sub.validFrom is null")
),
Property.forName("validFrom").eq(subselect)
)
);
这可能不会马上奏效,但希望能有所帮助。这看起来确实是Criteria API的又一个限制 我发现,为这类事情创建自己的标准或一套标准其实并不难 最大的问题是你基本上没有任何文档。抓取一些与您想要做的类似的实现。仔细观察,看看它生成了什么样的sql,冲洗并重复 虽然不好玩,但很管用
很抱歉,我没有针对问题的实现。嗨,Peter,很遗憾,这只是解决方案的50%。要符合我的要求,它需要是:resultCriterion.addRestrictions.orRestrictions.and Restrictions.isNullvalidFrom、Restrictions.isNullsubselect、Property.forNamevalidFrom.eqsubselect;但是isNull不能接受子查询,如果它接受子查询,它可能会复制sql中的suquery,这会很难看,尽管它不会杀死我。@Jens我刚刚更新了示例,希望能够处理这个问题。刚刚发现:。。。也许那有点用?