为什么当您使用其 ID 保存实体时,从 JPA 存储库中检索的订单会发生变化?

Why is order retrieval from JPA repository is changed when you save entity with its id?

我在 spring 引导应用程序中使用 JPA 存储库和 Hibernate 作为数据源。

我之前的数据:

[{"id":1,"name":"Not Stack"},{"id":2,"name":"Overflow"}]

我用这个数据做一个保存操作:

{"id":1,"name":"Stack"}

然后当我执行 findAll() 时,它检索到:

[{"id":2,"name":"Overflow"}, {"id":1,"name":"Stack"},]

这是它应该如何工作的吗?关于这个问题有什么想法或解决方法吗?

findAll()只是获取所有数据,没有指定顺序。如果您想要排序的结果,您应该使用 findAllOrderById()

findAll() 只是 returns 一个结果列表,其中 returns 结果 (ResultSet) 的顺序与数据库提供它们的顺序相同。它对这些记录进行排序的方式取决于 RDBMS,并且通常是最方便的方式。在这种情况下依赖顺序并不是一个好主意。

要保证记录按 ID 排序,您可以在存储库中创建自己的方法,例如:

// Full query
@Query("SELECT t FROM Type t ORDER BY t.id")
List<T> findAllOrdered();

// Shorthand relying on method naming
List<T> findAllOrderById();

有关方法命名的更多信息,请参见 Spring Data JPA 参考中的 4.3.2 Query creation

或者你可以使用findAll(org.springframework.data.domain.Sort)的方法,例如:

repository.findAll(new Sort("id"));