Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate. Загрузка размера дочерней коллекции


Автор: Wissenstein 12.10.2011, 22:46
Есть коллекция турниров. У каждого турнира есть коллекция игроков. Нужно выводить отчёт о всех турнирах за некоторый период с указанием числа игроков.
Иерархия классов мне досталась примерно такая (конечно, очень упрощённо):
Код

@Entity
public class Player {
    @Id
    private Long id;

    private String name;

    private int periodId;

    @Column(name="tournament_id")
    private Long tournamentId;

    // getters and setters
}

@Entity
public class Tournament {
    @Id
    private Long id;

    private String name;

    @OneToMany(cascade={CascadeType.PERSIST})
    @JoinColumn(name="tournament_id")
    private List<Player> players = new ArrayList<TournamentPlayer>();

    // getters and setters
}

public class Result {
    private String tournamentName;
    private int playerCount;

    public Result(String newName, int newCount) {
        tournamentName = newName;
        playerCount = newCount;
    }
    
    // getters and setters
}

Когда пытаюсь сформировать список турниров так:
Код

List<Tournament> tournaments = entityManager
        .createQuery("from Tournament t where t.periodId = :periodId")
        .setParameter("periodId", 123)
        .getResultList();

for (Tournament tournament: tournaments) {
    Result result = new Result(tournament.getName, tournament.getPlayers().size());
    results.add(result)
}

то для каждого турнира отдельно автоматически запускается 
Код
select * from players p where p.tournament_id = ?

Мне такое не подходит, потому что турниров может быть несколько десятков тысяч, и тогда время формирования отчёта будет неприемлемо долгим.
Когда я пробую сделать так:
Код

        .createQuery("from Tournament t left join fetch t.players where t.periodId = :periodId")

то в список турниров попадает столько копий каждого турнира, сколько у него игроков. То есть, мне нужно запрашивать не списки игроков, а лишь их количество. Но я никак не могу найти, как это сделать.
Подскажите, пожалуйста, как с использованием JPA QL организовать аналог такого SQL-запроса:
Код

select t.name, count(p.id) 
from tournaments t
    left join players p
        on p.tournament_id = t.id
where t.period_id = 123
group by t.name

Автор: Samotnik 12.10.2011, 23:52
Цитата(Wissenstein @  12.10.2011,  22:46 Найти цитируемый пост)
Подскажите, пожалуйста, как с использованием JPA QL организовать аналог такого SQL-запроса:

Неужели хибернетовский createQuery не прожёвывает этот код ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)