Можно ли упорядочить коллекцию родительских объектов как по свойству родителя, так и по свойству ребенка?
Допустим, у меня есть класс Entity с этим битом кода:
@OrderBy("age")
public List<Father> getFathers() {
return fathers;
}
У Отца есть свойство age, которое мы хотим упорядочить по возрастанию (как показано выше).
Отец может иметь ребенка. Ребенок также будет иметь свойство возраста. Я хотел бы getFathers()
вернуть список отцов так, чтобы они были упорядочены по возрасту отцов, а затем по возрасту по возрасту ребенка.
Если я оставлю приведенный выше код как есть, Отцы будут правильно расставлены по возрасту, но Отец (30 лет) с 10-летним Ребенком может прийти раньше отца (также 30 лет) с 5-летним Ребенок.
Я пытался сделать что-то вроде этого:
@OrderBy("age, child.age")
public List<Father> getFathers() {
return fathers;
}
Но я бы получил следующее исключение:
org.hibernate.AnnotationException: property from @OrderBy clause not found: Father.child.age
Редактировать: Извините, позвольте мне прояснить немного больше кода. getFathers()
находится не в дочерней сущности, а в другой сущности. Давайте назовем это Деревня:
@Entity
public class Village {
...
@OneToMany(mappedBy = "village",
targetEntity = Father.class)
@OrderBy("age")
public List<Father> getFathers() {
return fathers;
}
}
Итак, скажем, есть Деревня, и вы можете получить Отцов, которые живут в этой Деревне. Ради этого примера, допустим, что у Отца для какого-то странного деревенского правила может быть только один ребенок.
Так отец бы выглядел примерно так:
@Entity
public class Father {
private Child child;
...
@OneToOne(mappedBy = "father")
public Child getChild() {
return child;
}
public void setChild(Child child) {
this.child = child;
}
}
Итак, теперь в исходном классе Village я хочу, чтобы getFathers()
возвратил всех отцов в порядке возраста, плюс, если есть отцы того же возраста, я хочу, чтобы их затем распорядили по возрасту их ребенок.
Редактировать 2: Я также обнаружил, что могу получить эффект от того, что хочу, однако это не самый элегантный способ сделать это:
session.createFilter(village.getFathers(), "order by child.age");