按设置的子对象的值对父对象进行排序

Posted

技术标签:

【中文标题】按设置的子对象的值对父对象进行排序【英文标题】:Sorting a parent object by value of its set child 【发布时间】:2017-08-31 18:29:08 【问题描述】:

我正在尝试按其子对象的值对父对象列表进行排序 一套。所以假设我有ff:

父 1 和孩子的名字是玫瑰 Parent2 与孩子的名字客串 Parent3 与孩子的名字 abba, zeon, max.

当我对它进行降序排序时,它应该首先显示 Parent3,因为它有一个 z。 这是我当前的 hql,它得到 1>2>3 的错误结果:

SELECT DISTINCT p FROM Parent p JOIN p.children c ORDER BY c.name desc

没有不同的,尽管它选择了多个相同的父母,但它会很好。

我的模型设置如下:

 public class Parent 
 private Set<Child> children = new HashSet<Child>();
 

 public class Child
  private String name;

 

编辑:设法对其进行排序HQL order by within a collection 尽管当父母双方都有相同的 children.name 值时,它不会比较下一个可能的值。即

如果 Parent1 有孩子 abba, zeon Parent2 有孩子 abba,客串 升序应优先考虑 Parent2。

【问题讨论】:

看起来这个问题已经在hql-order-by-within-a-collection 中回答了希望这有帮助 @Jorge 谢谢这工作,虽然如果父母双方有相同的 children.name 值,它不会比较下一个名称值,即两者都有一个名为 acacia 的孩子,假设升序,它将比较下一个值,直到它找到可能的最早值(如果有) 【参考方案1】:

如果您不想复制父级,则无法使用集合来实现。您可以做的是选择父级并在每个父级中选择最大元素(按字母顺序)并按其排序。

围绕这些线的东西。

select p from Parent p 
where p.maxChild = 
     (select max(c.name) from Child c where c.parentID=p.parentID)

如果你愿意,你可以使用@Formula 来映射最大元素。所以根本不需要使用集合。

其实用公式可能会更好,你可以直接映射最大的名字和顺序,根本不用取集合。

【讨论】:

以上是关于按设置的子对象的值对父对象进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何按对象中的值对数组进行排序

按对象属性之一的值对对象列表进行排序,其中只有一个值是感兴趣的

在Java中按属性值对对象ArrayList进行排序

按字典键的值对包含 NSMutableDictionary 的 NSMutableArray 进行排序

vue onclick 对父组件中的子组件进行排序

Android-java-如何按对象内的某个值对对象列表进行排序