在Criteria Query

时间:2015-07-29 15:16:38

标签: java hibernate criteria hibernate-criteria criteria-api

我需要使用Criteria API

创建子查询

我创建的当前Criteria查询是

Criteria propCriteria = session.createCriteria(PropertyDetail.class);
            propCriteria.createAlias("property","prop");
            propCriteria.createAlias("country", "country");
propCriteria.add(Restrictions.eq("prop.propertyId",promotionFormBean.getPropertyId()));

Hibernate生成的SQL是

  

从PROPERTY_DETAILS this_,COUNTRY_MASTER country2_中选择*,   PROPERTY_MASTER prop1_,USER_MASTER user6_,ROLE_MASTER role7_,   USER_MASTER user8_ where this_.country_id = country2_.country_Id和   this_.property_id = prop1_.PROPERTY_ID和   prop1_.archive_user_id = user6_.id(+)和   user6_.role_id = role7_.ROLE_ID(+)和   prop1_.create_user_id = user8_.id(+)和prop1_.PROPERTY_ID =?。

我需要做的是使用标准

生成以下SQL
  • 必需:
  

从PROPERTY_DETAILS this_,COUNTRY_MASTER country2_中选择*,   PROPERTY_MASTER prop1_,USER_MASTER user6_,ROLE_MASTER role7_,   USER_MASTER user8_ where(this_.country_id = country2_.country_Id 或   country2_.controller_order in(select from zone_id from   property_zone_mapping where property_id =?) )和   this_.property_id = prop1_.PROPERTY_ID和   prop1_.archive_user_id = user6_.id(+)和   user6_.role_id = role7_.ROLE_ID(+)和   prop1_.create_user_id = user8_.id(+)和prop1_.PROPERTY_ID =?

必需section.Property_zone_mapping的粗体部分是另一个与PropertyDetail.class无关的表。

我想以某种方式使用子查询来使用此表。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我发现条件查询比HQL更难阅读。你考虑过NamedQuery吗?

@NamedQueries({
    @NamedQuery(
        name="PropertyDetail.findByPropertyId", 
        query="from PropertyDetail join property p join country c where p.propertyId = :propertyId"
    )
})
public class PropertyDetail {
    ...
}

public class PropertyDetailDao {
    public List<PropertyDetail> findByPropertyId(long propertyId) {
        Query query = getSession().getNamedQuery("PropertyDetail.findByPropertyId");
        query.setParameter("propertyId", propertyId);
        return query.list();
    }
}