Hibernate Criteria - 如何将连接结果限制为单个实体类型?

时间:2010-12-07 13:45:16

标签: java sql hibernate criteria

好的,所以以下查询:

SELECT O.*, P.* FROM ORDERS O, PRODUCT P WHERE
    O.ORDER_ID=P.ORDER_ID AND P.ID=’1234’;

可以使用Criteria完成,如下所示:

List ordersAndProducts = session.createCriteria(Order.class)
    .setFetchMode(“products”,FetchMode.JOIN)
    .add(Restrictions.eq(“id”,”1234”))
    .list();

但此处Criteria.list()返回List<Object[]>,其中Object[0]OrderObject[1]为列表中每个元素的Product

但是如何使用Criteria执行以下SQL:

SELECT O.* FROM ORDERS O, PRODUCT P WHERE 
    O.ORDER_ID=P.ORDER_ID AND P.ID=’1234’;

换句话说,我希望Criteria.list()给我一个List<Order>,我不关心Products。我尝试使用createAlias()代替setFetchMode(),但结果是相同的,并且Projections不允许您指定实体,只指定属性。

2 个答案:

答案 0 :(得分:6)

您可以在条件上使用.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)

List ordersAndProducts = session.createCriteria(Order.class)
    .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
    .setFetchMode(“products”,FetchMode.JOIN)
    .add(Restrictions.eq(“id”,”1234”))
    .list();

现在您使用急切加载的产品检索所有订单。

答案 1 :(得分:2)

使用createCriteria类的Criteria方法进行关系。

List ordersAndProducts = session.createCriteria(Order.class)
    .createCriteria(“products”)
        .add(Restrictions.eq(“id”,”1234”))
    .list();

您可以阅读有关它的{略微令人困惑的]文档here