【问题标题】:Subquery in where clause with CriteriaQuery带有 CriteriaQuery 的 where 子句中的子查询
【发布时间】:2013-05-19 23:24:50
【问题描述】:

谁能给我一些关于如何将这种子查询放在CriteriaQuery 中的提示? (我正在使用 JPA 2.0 - Hibernate 4.x

SELECT a, b, c FROM tableA WHERE a = (SELECT d FROM tableB WHERE tableB.id = 3) - 第二次选择总是得到一个结果或空值。

【问题讨论】:

    标签: java hibernate jpa subquery criteria-api


    【解决方案1】:

    尝试类似以下示例来创建子查询:

    CriteriaQuery<Object[]> cq = cb.createQuery(Object[].class);
    Root tableA = cq.from(TableA.class);
    
    Subquery<String> sq = cq.subquery(TableB.class);
    Root tableB = cq.from(TableB.class);
    sq.select(tableB.get("d"));
    sq.where(cb.equal(tableB.get("id"), 3));
    
    cq.multiselect(
        cb.get("a"),
        cb.get("b"),
        cb.get("c"));
    cq.where(cb.equal(tableA.get("a"), sq));
    List<Object[]> = em.createQuery(cq).getResultList();
    

    请注意,由于附近缺少 IDE,代码尚未经过测试。

    【讨论】:

    • 我认为我指定了我的 where 子句将始终返回一个结果。
    • 编辑了问题。如果您需要其他详细信息,请询问我。谢谢。
    • 如果出现null-case,您希望查询做什么?
    • 返回nulla字段没有空值)。
    • 你不必写Root tableB = sq.from(TableB.class)而不是Root tableB = cq.from(TableB.class) [第5行,sq而不是cq]?
    【解决方案2】:

    您可以使用DetachedCriteria 代表子查询。您的代码应类似于:

    DetachedCriteria subCriteria = DetachedCriteria.forClass(TableB.class);
    subCriteria.add(Property.forName("id").eq(3)); //WHERE tableB.id = 3
    subCriteria.setProjection(Projections.property("d")); // SELECT d from
    
    DetachedCriteria criteria = DetachedCriteria.forClass(getPersistentClass());
    criteria.add(Property.forName("a").eq(subCriteria)); //a = (sub-query)
    criteria.setProjection(Projections.property("a"); //SELECT a
    criteria.setProjection(Projections.property("b"); //SELECT b
    criteria.setProjection(Projections.property("c"); //SELECT c
    return getHibernateTemplate().findByCriteria(criteria);
    

    【讨论】:

    • 您的代码是否符合JPAgetHibernateTemplate() 是什么意思?
    • 是的,符合 JPA。 getHibernateTemplate() 用作休眠会话的包装器。这负责打开/关闭会话(所有 BolierPlate 代码)并且它是线程安全的。它还公开了会话方法和查询条件,如保存、更新等。
    • 好的。如果我更改 JPA 实现,我想我将无法运行该代码(只要它特定于休眠)。我想要一个基于 JPA 的解决方案。无论如何,当您依赖 Hibernate 时,我认为您的解决方案可以满足我的需求。谢谢。
    猜你喜欢
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 2011-08-27
    • 1970-01-01
    • 2016-03-11
    • 2012-01-23
    相关资源
    最近更新 更多