【问题标题】:Hibernate subquery休眠子查询
【发布时间】:2009-09-11 14:38:11
【问题描述】:

我在使用 Hibernate 创建子查询时遇到问题。不幸的是,Subqueries 类几乎完全没有文档,所以我完全不知道如何将以下 SQL 转换为 Hibernate Criteria:

SELECT id
FROM car_parts
WHERE car_id IN ( SELECT id FROM cars WHERE owner_id = 123 )

我希望以下内容能够“正常工作”:

session.createCriteria(CarParts.class).add(eq("car.owner", myCarOwner));

但不幸的是它没有。所以看来我实际上必须使用 Subqueries 类来创建 Criteria。但是我无法通过谷歌找到一个合理的例子,所以我在这里问它。

【问题讨论】:

    标签: java sql hibernate


    【解决方案1】:

    试试这样:

    表详细信息):类别(id、name、desc、parentId、active)

        DetachedCriteria subCriteria = DetachedCriteria
                .forClass(Category.class);
        subCriteria.add(Restrictions.isNull("parent"));
        subCriteria.add(Restrictions.eq("active", Boolean.TRUE));
        subCriteria.add(Restrictions.eq("name", categoryName));
        subCriteria.setProjection(Projections.property("id"));
    
        Criteria criteria = getSession().createCriteria(Category.class);
        criteria.add(Restrictions.eq("active", Boolean.TRUE));
        criteria.add(Subqueries.propertyEq("parent", subCriteria));
    

    它将生成如下查询:

    select
        *
    from
        Categories this_ 
    where
        this_.active=1
        and this_.parentId = (
            select
                this0__.id as y0_ 
            from
                Categories this0__ 
            where
                this0__.parentId is null 
                and this0__.active=1
                and this0__.name='Health Plan'
        )
    

    祝你好运!

    -罗塔什·辛格

    【讨论】:

    • criteria.add(Subqueries.propertyEq("parent", subCriteria));这里的父母是什么?
    【解决方案2】:

    在添加 eq 表达式之前,尝试为“car”属性创建一个别名,如下所示:

    session.createCriteria(CarParts.class)  
            .createAlias("car", "c")  
            .add(eq("c.owner", myCarOwner));  
    

    【讨论】:

      【解决方案3】:

      首先检查 Car 和 CarPart 实体之间的 ORM 配置,通常您需要设置它们之间的关系。之后尝试执行以下代码:

      List result = session.createQuery("from " + CarPart.class.getName() + 
          " as parts join parts.car as car where car.owner = :myOwner")
          .setParameter("myOwner", 123)
          .list();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-06
        • 2011-04-13
        • 1970-01-01
        • 2011-08-09
        相关资源
        最近更新 更多