【问题标题】:Create subquery in Criteria Query在 Criteria Query 中创建子查询
【发布时间】:2015-07-29 15:16:38
【问题描述】:

我需要使用 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_ 其中 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 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=?

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

我想通过子查询以某种方式使用这个表。

提前致谢。

【问题讨论】:

  • 对于this_.country_id=country2_.country_Id,这个join部分是由hibernate生成的,改成需要的自定义join子句并不容易。请改用 HQL 或 SQL 查询。如果您还想使用子查询,请为相关实体添加详细信息(模式,关联),看看是否可以将查询重构为使用子查询。

标签: java hibernate criteria hibernate-criteria


【解决方案1】:

我发现条件查询比 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();
    }
}

【讨论】:

    猜你喜欢
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多