我正在构建一个Hibernate Criterion,使用如下的子选择
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ültigerBezeichner
错误消息,表示“无效标识符”
答案 0 :(得分:5)
你可以尝试这样的事情,而不是有问题的一行:
resultCriterion.add(
Restrictions.or(
Restrictions.and(
Restrictions.isNull("validFrom"),
Restrictions.sqlRestriction("sub.validFrom is null")
),
Property.forName("validFrom").eq(subselect)
)
);
这可能不会马上起作用,但希望有所帮助。
答案 1 :(得分:0)
看起来这似乎是Criteria API的另一个限制。
我发现为这种事情创建自己的Criterion(或Criterions)实际上并不困难。
最大的问题是你基本上必须没有任何文件。抓住一些类似于你想要做的实现。仔细查看它,看看它生成了什么,冲洗并重复。
不好玩,但有效。
很抱歉,我没有针对该问题的问题实施。