在Hibernate标准API中使用subselect进行空处理

在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

我正在构建一个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 (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我刚刚更新了示例,希望能够处理这个问题。刚刚发现:。。。也许那有点用?