2009-09-11 128 views
4

我在使用Hibernate创建子查询时遇到问题。不幸的是,子查询类是几乎完全没有证件,所以我绝对不知道如何以下SQL转换成休眠标准:休眠子查询

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。但我无法通过谷歌找到一个合理的例子,所以这让我在这里问它。

回答

5

尝试加入EQ表达这样之前创建的别名“汽车”属性:

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

由于先检查汽车和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(); 
7

尝试像这样:

表详细信息):类别(ID,姓名,递减,parentId的,活跃的)

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)); 

它会生成查询,如:

选择 * 从 分类THIS_ 地方 this_.active = 1 和this_.parentId =( 选择 this0_ .ID为Y0 从 分类this0__ 其中 this0_ .parentId为空 和0类别 _.active = 1 和this0__。 name ='Health Plan' )

祝你好运!

-Rohtash辛格

+2

criteria.add(Subqueries.propertyEq( “父”,子标准));这里的父母是什么? – 2015-11-10 16:50:21