用@ElementCollection和@OrderColumn注释的嵌入列表上的顺序不正确

时间:2019-03-23 17:16:26

标签: java jpa

加载父项及其子项,但顺序与数据库中的顺序不同。

有一个Parent类,其中包含可嵌入的Child列表,均以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 :(得分:0)

我的猜测是它可以正常工作。您正在使用JPQL查询来获取子级列表。我认为@OrderColumn在这种情况下不起作用。不应该这样,因为在这种情况下没有使用它。

如果您希望它工作,则需要获取Parent记录。假设您可以通过ID(示例)找到它:

Parent parent = findById(1);  

现在您可以从父母那里获得孩子的清单:

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

并且只有当您这样获得children时,您才应该期望结果列表是有序的。

Happy Hacking:)