【问题标题】:Hibernate Criteria and NULLsHibernate 标准和 NULL
【发布时间】:2012-05-06 11:45:41
【问题描述】:

我正在构建一个 Hibernate Criteria,它将获取所有具有有效合同日期的 Appartments。 公寓和合同之间存在一对一的关系。它们没有嵌入。 合同不是强制性的,因此公寓可能没有合同。 合同有开始日期和结束日期,但它们不是强制性的,因此其中一个或两个都可能为 NULL。

  • 如果没有合同,则表示该公寓有永无止境的合同。
  • 如果合约开始为NULL,则表示合约从天开始就持续了
  • 如果合约结束为NULL,则合约永久有效。

基本上我正在向我的 DAO 发送一个整数。整数表示年份。 DAO 应返回该年某个时间有效/有效的所有公寓。 这意味着它应该返回:

  • 所有未签订合同的公寓
  • startDate 早于或等于今年,且 endDate 为 NULL 的所有公寓
  • endDate 等于或晚于今年,且 startDate 为 NULL 的所有 Appartments
  • startDate 等于或早于今年,enddate 等于或晚于今年的所有公寓。

到目前为止,我不确定如何处理 NULL。以及如何将年份与日期字段进行比较。任何帮助将不胜感激。

我已经走到这一步了:

DetachedCriteria criteria = DetachedCriteria.forClass(Appartment.class)
    .setFetchMode("contract", FetchMode.JOIN)
    .createAlias("contract", "c")
    .add(Restrictions.le("c.startDate", ????))
    .add(Restrictions.ge("c.endDate", ????));

【问题讨论】:

  • 好吧,不要介意NULL。我已经重构了我的代码以执行默认值而不是使它们可以为空。我将年度比较作为一个单独的问题并结束此

标签: java hibernate


【解决方案1】:

至于 null,您需要使用显式的 NullExpression 标准,就像您编写直接 SQL 时会使用的那样。

【讨论】:

  • 您能否提供更详细的信息来说明如何使用它?我现在在谷歌上搜索它,但找不到任何像样的例子..
  • 它有什么用? Restrictions.isNull(propName)我没有尝试过(我必须设置整个堆栈),但如果它不起作用,我会感到惊讶。
  • 是的,但它并没有真正解决我的问题。我需要在空值上设置一个默认值。例如。如果 startdate 为空,则将其视为 01-01-1980。我想在一份声明中完成所有工作。
  • 在 Hibernate 中有 coalesce。我可以查看 Criterion API 以查看它是否存在。我查了一下,没有一流的支持。他们指导您使用通用设施sqlRestriction
猜你喜欢
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
相关资源
最近更新 更多