Гибернация: сортировка детей по отношениям «один-один + много-один» - PullRequest
0 голосов
/ 01 мая 2018

У меня есть объект Contact, связанный с объектом ContactList через отношение @OneToMany. Затем объект ContactList подключается к объекту списка просмотра через @ManyToOne. Сущность ContactList содержит данные, относящиеся к контакту в списке. Мне нужно отсортировать детей ContactList из Контакта по метке времени onOn в Списке отзывов. Я не уверен, что это возможно.

Контактное лицо

@OneToMany(mappedBy = "contact")
@OrderBy("created_on DESC") <-- This does not work.
private SortedSet<ContactList> contactLists;

объект ContactList:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "LIST_ID")
private ReviewList reviewList;

Сравнение списков контактов:

@Override
public int compareTo(ContactList b) {
    if (this.getReviewList().getCreatedOn().getTime() == b.getReviewList().getCreatedOn().getTime()) {
        log.error("Two review lists have the exact same created time???");
        return 0;
    }

    return this.getReviewList().getCreatedOn().getTime() < b.getReviewList().getCreatedOn().getTime() ? -1 : 1;
}

Просмотр списка созданНа поле Я пытаюсь отсортировать родительский элемент по:

@Column(name="CREATED_ON", updatable=false)
private Timestamp createdOn;

Я пробовал без нотации @OrderBy, и он не скомпилируется. Но все, что я пытался вставить в цитату, терпит неудачу. Я пробовал contactList, как показано, reviewList, reviewList.createdOn, reviewList_createdOn и еще пару действительно глупых.

Похоже, что Hibernate берет первую часть строки в кавычках и помещает ее в запрос напрямую. Что бы я ни там вставил, ошибки с этим:

Вызвано: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: неизвестный столбец 'contactlis0_.created_on' в 'предложении заказа' at sun.reflect.NativeConstructorAccessorImpl.newInstance0 (собственный метод) ~ [na: 1.8.0_91] at sun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:62) ~ [na: 1.8.0_91] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45) ~ [na: 1.8.0_91] в java.lang.reflect.Constructor.newInstance (Constructor.java:423) ~ [na: 1.8.0_91] в com.mysql.jdbc.Util.handleNewInstance (Util.java:425) ~ [mysql-connector-java-5.1.44.jar: 5.1.44] в com.mysql.jdbc.Util.getInstance (Util.java:408) ~ [mysql-connector-java-5.1.44.jar: 5.1.44] в com.mysql.jdbc.SQLError.createSQLException (SQLError.java:943) ~ [mysql-connector-java-5.1.44.jar: 5.1.44]

И, конечно, так и есть, поскольку я пытаюсь сослаться на поле в другой таблице. Между ними нужно сделать что-то вроде JoinColumn.

Есть ли способ сделать это? Возможно, я мог бы написать собственный запрос JPQL, чтобы отсортировать их так, как я хочу, и передать его на страницу отдельно, но я пытался сделать это с помощью аннотации и спящего режима.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Мое решение до сих пор состоит в том, чтобы добавить поле list_created_on в объект ContactList, а затем обновить данные так, чтобы у каждой записи была дата ReviewList созданный_он. Затем, когда я создаю новый ContactList в базе данных, я просто устанавливаю для него дату создания списка просмотра. Мне не очень нравится хранить одни и те же данные в двух местах, но я не могу их обойти.

Это кажется не элегантным, но я не мог понять, как ссылаться на ребенка ребенка в спящем режиме с помощью аннотации. И сортировка теперь работает так, как я хотел.

Я не приму это как ответ, если у кого-то еще есть лучшее решение.

0 голосов
/ 01 мая 2018

Я считаю, что причиной ваших проблем является тот факт, что вы используете SortedSet. Независимо от того, как hibernate вставляет значения, они будут упорядочены в соответствии с контрактом SortedSet. Если вы не внедрили Comparable в ContactList , это будет естественный порядок ContactList. Если вы реализовали Comparable, то ваш список будет отсортирован в соответствии с этой реализацией. Я не думаю, что и ваш желаемый результат.

Попробуйте определить свою коллекцию как Установите , если хотите, чтобы БД выполняла упорядочение.

...