Java 具有一对多关联的休眠条件

Java 具有一对多关联的休眠条件,java,hibernate,orm,Java,Hibernate,Orm,我有一个订单实体(表示订单),每个订单都有一组交货日期。 我正在尝试实现一个搜索功能,并在JFace TableViewer中显示结果 我希望对于每个具有多个交货日期的订单,它应该在表中重复,但DeliveryDate列将显示此实例的特定交货日期 在SQL中,使用简单的联接可以轻松地完成此查询,并且每行都会使用不同的日期进行复制。 由于我正在执行一个搜索功能,所以我将逐步构建查询(取决于用户选择的搜索参数),因此使用条件构建查询非常有用。问题是,我得到的结果列表是重复的(这是可以的),但每个实体

我有一个订单实体(表示订单),每个订单都有一组交货日期。 我正在尝试实现一个搜索功能,并在JFace TableViewer中显示结果

我希望对于每个具有多个交货日期的订单,它应该在表中重复,但DeliveryDate列将显示此实例的特定交货日期

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

使用Critera有什么方法可以做到这一点吗?如果没有,我该怎么做

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

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

Criteria crit=session.createCriteria(Order.class)
.createAlias(“交货日期”、“dd”)
.setResultTransformer(标准.别名到实体映射);
我给deliveryDates集合一个别名,并使用ResultTransformer在映射中返回结果。搜索结果列表将包含具有两个键的映射,“this”(又名Criteria.ROOT_别名)和“dd”。这将为我提供我想要的行复制,现在我可以像这样获取相应的对象:

Map-Map=(Map)元素;
Order ord=(Order)map.get(Criteria.ROOT\u别名);
DeliveryDate dd=(DeliveryDate)map.get(“dd”);

重复条目(具有相同数据)的原因是生成的行(重复的行)具有相同的主键,并且hibernate对其进行相同的处理

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

此外,HQL可能是一个更容易的选择(在这样的场景中,我通常更喜欢HQL)

更好的解决方案:
如果您可以将查询(至少是其中的一部分)转换为视图并从中获取数据,那么大多数问题都会得到解决,这将是一个更好的设计。

重复条目(具有相同数据)的原因是,生成的行(重复的行)具有相同的主键,并且hibernate会对其进行相同的处理

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

此外,HQL可能是一个更容易的选择(在这样的场景中,我通常更喜欢HQL)

更好的解决方案:
如果您可以将查询(至少是其中的一部分)转换为视图并从中获取数据,那么大多数问题都会得到解决,这将是一个更好的设计。

在一对多场景中实现所需的另一种方法是在关系的“多”端建立标准

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

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

在一对多场景中实现所需的另一种方法是在关系的“多”端建立标准

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

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

谢谢你的回复。我可以在HQL中执行类似的操作,例如:“选择dd.deliveryDate,将订单中的od作为od left加入od.deliveryDates dd”。这似乎返回了重复项(正如我所希望的),并且对于每一行,deliveryDate都是不同的。问题是,我正在做一个搜索窗口,在这个窗口中,用户可以自由选择搜索参数,而且我更容易使用条件以增量方式构建查询(因此我不会筛选他没有要求的列)。因此,基本上,我希望条件查询返回的不仅仅是订单对象,我希望每个重复订单都有不同的日期。我理解。。HQL是一个建议(并不是说标准不能完成这项工作)。。出现重复条目问题的原因是主键。。请做点什么。谢谢你的帮助,我找到了解决方案(我编辑了我的原始帖子来展示)。谢谢你的回复。我可以在HQL中执行类似的操作,例如:“选择dd.deliveryDate,将订单中的od作为od left加入od.deliveryDates dd”。这似乎返回了重复项(正如我所希望的),并且对于每一行,deliveryDate都是不同的。问题是,我正在做一个搜索窗口,在这个窗口中,用户可以自由选择搜索参数,而且我更容易使用条件以增量方式构建查询(因此我不会筛选他没有要求的列)。因此,基本上,我希望条件查询返回的不仅仅是订单对象,我希望每个重复订单都有不同的日期。我理解。。HQL是一个建议(并不是说标准不能完成这项工作)。。出现重复条目问题的原因是主键。。谢谢你的帮助,我找到了解决方案(我编辑了我的原始帖子来展示)。