我有一个订单实体(嗯,重新订购订单),每个订单都有一组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");
答案 0 :(得分:0)
重复条目(具有相同数据)的原因是结果行(重复的)具有相同的主键和&通过休眠来对待它们。
作为一种解决方案,您需要确保为每个条目计算不同的PK(尝试使用此处的投影)。
同样HQL可能是一个更容易的选择(在这种情况下我通常更喜欢HQL)。
更好的解决方案: 如果你可以将查询(至少是其中的一部分)转换为视图&从中获取数据然后将解决大部分问题。这将是一个更好的设计。
答案 1 :(得分:0)
在one to many
场景中实现所需目标的另一种方法是在关系的“多个”端建立标准。
Criteria crit = session.createCriteria(DeliveryDate.class);
...
DeliveryDate dd = (DeliveryDate) element;
Order ord = dd.getOrder();