Совершенно уверен, но не на 100%, он будет делать следующее:
Он объединит игроков и предметы, упорядочит по playerID и возьмет первые 25 результатов, все в одном SQL-запросе. Исходя из этих данных, он создает игроков и предметы, в результате чего получается произвольное количество игроков (меньше или равно 25) с общим количеством предметов 25. Может случиться, что последний игрок не получит все предметы.
Чтобы получить 25 игроков, избегайте FetchMode.JOIN
(чтобы избежать проблемы N + 1, используйте размер пакета в файле отображения):
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();
Если нет навигации от предмета к игроку, вы можете добавить его.