【问题标题】:Hibernate criteria: why no Subqueries.isNull(DetachedCriteria)?休眠条件:为什么没有 Subqueries.isNull(DetachedCriteria)?
【发布时间】:2011-06-01 13:31:45
【问题描述】:

我想将这样的脚本翻译成标准:

SELECT ...
FROM A
WHERE 
  A.some_date > (select bdate from B where ...)
  OR (select bdate from B where ...) IS NULL

因此,如果 A.Some_date > B.bdate 或 B.bdate 为 NULL,则应返回 A。

我期待有一个Subqueries.notNull(DetachedCriteria)(就像有一个SubQueries.notExists(DetachedCriteria)),但这种方法不存在,我也没有找到其他方法来解决这个问题。

我当然可以通过返回一个计数并检查它是否 > 0 或这样来解决这个问题,但是我需要编写 2 个相同的(除了投影)DetachedCriteria's。

有谁知道是否/如何对上述情况进行 is NULL 检查,或者为什么 Hibernate 标准 API 中没有提供此功能?也许有一个很好的理由......

【问题讨论】:

  • 您找到解决方案了吗?因为我和你上面描述的需求一样
  • 很遗憾,它不可用。

标签: java hibernate criteria detachedcriteria


【解决方案1】:

类 MySubqueries:

public class MySubqueries {
    public static Criterion isNull(DetachedCriteria dc) {
        return new IsNullSubqueryExpression(null, null, dc);
    }
}

类 IsNullSubqueryExpression:

public class IsNullSubqueryExpression extends SubqueryExpression {

    protected IsNullSubqueryExpression(String op, String quantifier, DetachedCriteria dc) {
        super(op, quantifier, dc);
    }

    @Override
    protected String toLeftSqlString(Criteria criteria, CriteriaQuery criteriaQuery) {
        return "";
    }

    @Override
    public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
        return super.toSqlString(criteria, criteriaQuery) + " IS NULL";
    }
}

使用:

detachedCriteria.add(MySubqueries.isNull(subDetachedCriteria))

【讨论】:

  • 寻求解决方案永远不会太晚 :)
【解决方案2】:

我觉得

Subqueries.eq(null, yourDetachedCriteria)

应该可以。

【讨论】:

  • tx,我会在星期一试一试
  • 不幸的是,这不起作用; hibernate 把它翻译成 ? = (subquery) 应该是 (subquery) IS NULL
  • 嗯。我希望 Hibernate 能够解决这个问题。我想它不能用准备好的陈述来做到这一点。我认为它尝试使用仅执行操作的org.hibernate.criterion.SimpleSubqueryExpression。但是您可以尝试创建自己的org.hibernate.criterion.SubqueryExpression,这样可以正确生成is null。它应该相当简单。我建议查看org.hibernate.criterion.SimpleSubqueryExpression 的来源。
  • Tx,已经考虑过这样做,对我来说这似乎很奇怪,因为它没有提供 OOTB。也许我会为此创建一个 jira 问题。
  • 可能有些事情我们不知道。也可以在他们的论坛上提问。另一方面,它听起来不像是超级典型的用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
  • 2018-02-18
  • 2016-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
相关资源
最近更新 更多