我有两张 table ,“玩家”和“物品”。玩家有一个物品 list 。我想使用分页检索玩家及其所有项目。我想根据玩家进行分页,而不考虑有多少项目。
所以我做这样的事情:
Criteria c = session.createCriteria(Players.class).setFetchMode("items", FetchMode.JOIN);
c.addOrder(Order.asc("playerID"));
c.setFirstResult(0);
c.setMaxResults(25);
List<Player> players = c.list();
这是要给我前 25 个玩家,还是给我前 25 个项目(按玩家分组)?我想知道这种行为是否像 JPA 查询那样未定义,或者是否有保证的答案。
无论如何,什么是 Criteria 查询,可以为我提供前 25 名玩家或前 25 名玩家-物品组合(按玩家 ID 排序,然后是物品 ID)?
最佳答案
可以肯定,但不是 100%,它将执行以下操作:
它将加入玩家和物品,按玩家 ID 排序并获取前 25 个结果,所有这些都在一个 SQL 查询中。根据这些数据,它会创建玩家和物品,这将导致任意数量的玩家(小于或等于 25)总共 25 个物品。可能会发生最后一个玩家没有得到所有物品的情况。
要获得 25 个玩家,请避免 FetchMode.JOIN
(为了避免 N+1 问题,请在映射文件中使用 batch-size):
List<Player> first25Players = session
.createCriteria(Players.class)
.addOrder(Order.asc("playerID"))
.setMaxResults(25)
.list();
要获得 25 个物品,请按物品而不是玩家开始查询。
List<Item> first25Items = session
.createCriteria(Item.class)
.addOrder(Order.asc("player")) // assuming that player is available
.setMaxResults(25)
.list();
如果没有从该项目到播放器的导航,则可以添加一个。