Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hibernate. Загрузка размера дочерней коллекции, Как загрузить список одним запросом? 
:(
    Опции темы
Wissenstein
Дата 12.10.2011, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 7.8.2007
Где: Харків, Україна

Репутация: нет
Всего: нет



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

@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

PM MAIL ICQ GTalk   Вверх
Samotnik
Дата 12.10.2011, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 5
Всего: 191



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

Неужели хибернетовский createQuery не прожёвывает этот код ?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0446 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.