好的,所以以下查询:
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]
为Order
,Object[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不允许您指定实体,只指定属性。
答案 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。