具有一对多关联的Hibernate Criteria

时间:2011-09-12 05:06:51

标签: java hibernate orm

我有一个订单实体(嗯,重新订购订单),每个订单都有一组DeliveryDates。  我正在尝试实现搜索功能并在JFace TableViewer中显示结果。

我希望每个具有多个交付日期的订单都应该在表中重复,但DeliveryDate列会显示此实例的特定交付日期。

使用简单连接可以在SQL中轻松完成此查询,并且每行都会以不同的日期复制行。  由于我正在进行搜索功能,我正在逐步构建查询(取决于用户选择的搜索参数),因此使用Criteria构建查询非常有用。问题是,我得到的结果列表是重复的(这是正常的),但每个实体只包含相同的DeliveryDates集 - 所以我不能为同一订单的不同行打印不同的日期。

有没有办法用Critera做到这一点?如果没有,我该怎么做?

编辑:编辑:例如,这个HQL查询似乎做了类似的事情:“select dd.deliveryDate,od from Order as od left join od.deliveryDates dd”

答案: 我找到了一个解决方案:

    Criteria crit = session.createCriteria(Order.class)
            .createAlias("deliveryDates", "dd")
            .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);    

我为deliveryDates集合添加了一个别名,并使用ResultTransformer在Map中返回结果。搜索结果列表将包含具有两个键的映射,“this”(又名Criteria.ROOT_ALIAS)和“dd”。这将为我提供我想要的行重复,现在我可以抓住相应的对象:

        Map map = (Map) element;
        Order ord = (Order) map.get(Criteria.ROOT_ALIAS);
        DeliveryDate dd = (DeliveryDate) map.get("dd"); 

2 个答案:

答案 0 :(得分:0)

重复条目(具有相同数据)的原因是结果行(重复的)具有相同的主键和&通过休眠来对待它们。

作为一种解决方案,您需要确保为每个条目计算不同的PK(尝试使用此处的投影)。

同样HQL可能是一个更容易的选择(在这种情况下我通常更喜欢HQL)。

更好的解决方案: 如果你可以将查询(至少是其中的一部分)转换为视图&从中获取数据然后将解决大部分问题。这将是一个更好的设计。

答案 1 :(得分:0)

one to many场景中实现所需目标的另一种方法是在关系的“多个”端建立标准。

Criteria crit = session.createCriteria(DeliveryDate.class);
...

DeliveryDate dd = (DeliveryDate) element; 
Order ord = dd.getOrder();