Неверный порядок встраиваемого списка с аннотациями @ElementCollection и @OrderColumn - PullRequest
0 голосов
/ 23 марта 2019

Загрузка родительского элемента и его дочерних элементов, но порядок НЕ соответствует базе данных.

Существует родительский класс со списком встраиваемых дочерних элементов, оба аннотированы для JPA.

@Entity
class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String name;

    @ElementCollection
    @OrderColumn
    private List<Child> children;
}

@Embeddable
class Child {
    private String name;
}

Связанные таблицы заполнены набором тестовых данных, как показано ниже. Обратите внимание, что children_order поменялся местами. Также важен порядок строк.

+----+--------+    +----+-----------+----------------+---------+
| id | name   |    | id | parent_id | children_order | name    |
+----+--------+    +----+-----------+----------------+---------+
| 1  | parent |    | 1  | 1         | 1              | child 0 |
+----+--------+    +----+-----------+----------------+---------+
                   | 2  | 1         | 0              | child 1 |
                   +----+-----------+----------------+---------+ 

Вот тестовый пример JUnit. Фабрика EntityManagerFactory инициализируется в @BeforeClass, а набор тестовых данных загружается в @ Before.

em = factory.createEntityManager();
String jpql = "select p.children from Parent p where p.id=:id";
List<Child> children = em.createQuery(jpql, Child.class)
                         .setParameter("id", 1)
                         .getSingleResult();
em.close();

assertThat(children.get(0).name, equalTo("child 1"));
assertThat(children.get(1).name, equalTo("child 0"));

Тестовый пример не пройден, я понятия не имею, почему. Конечно, я делаю что-то не так, но я не знаю что. Я сделал поиск в Интернете и, конечно, ТАК, но не повезло. Пожалуйста, помогите.

1 Ответ

0 голосов
/ 23 марта 2019

Я предполагаю, что это работает так, как должно работать. Вы выбираете список детей, используя запрос JPQL. Я не думаю, что в этом случае @OrderColumn будет работать. Так не должно быть, потому что в этом случае он не используется.

Если вы хотите, чтобы это работало, вам нужно вместо этого извлечь Parent запись. Допустим, вы можете найти его по идентификатору (пример):

Parent parent = findById(1);  

Теперь вы можете получить список детей от родителя:

List<Child> children = parent.getChildren();

и только когда вы получите children, как это, вы должны ожидать, что ваш список результатов будет упорядочен.

Счастливого взлома:)

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