加载父项及其子项,但顺序与数据库中的顺序不同。
有一个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"));
测试用例失败了,我不知道为什么。当然,我做错了什么,但我不知道该怎么办。我确实在互联网上搜索,但是当然没有运气。请帮忙。
答案 0 :(得分:0)
我的猜测是它可以正常工作。您正在使用JPQL查询来获取子级列表。我认为@OrderColumn
在这种情况下不起作用。不应该这样,因为在这种情况下没有使用它。
如果您希望它工作,则需要获取Parent
记录。假设您可以通过ID(示例)找到它:
Parent parent = findById(1);
现在您可以从父母那里获得孩子的清单:
List<Child> children = parent.getChildren();
并且只有当您这样获得children
时,您才应该期望结果列表是有序的。
Happy Hacking:)