Порядок как родителем, так и потомком, используя JPA - PullRequest
0 голосов
/ 15 ноября 2010

Можно ли упорядочить коллекцию родительских объектов как по свойству родителя, так и по свойству ребенка?

Допустим, у меня есть класс 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");

1 Ответ

3 голосов
/ 15 ноября 2010

Похоже, вам не хватает двустороннего сопоставления. Вы также должны отобразить Child в Father.

Кстати, между Father и Child, между прочим, должна быть традиционная связь. Это означает, что в классе Father должно быть свойство List<Child> children;, а не наоборот.

[EDIT]

Нет, ты не можешь так поступить. Зачем? Потому что, когда вы определяете свой @OrderBy("age, child.age"), все это, child.age, будет рассматриваться как свойство. Это будет рассматриваться как String. Следовательно, действительно, у вас нет имени свойства child.age в Father классе. Я надеюсь, что вы поняли мою точку зрения. Итак, решение Filter, которое вы придумали, - это хороший путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...