#java #hibernate #hql
#java #переход в спящий режим #hql
Вопрос:
Я получил Set<UserDTO>
коллекцию в объекте, не находящемся в режиме гибернации, и я получил объект User
домена в режиме гибернации.
UserDTO
содержит меньше информации о пользователе (только идентификатор и имя)
Как я могу выбрать пользователя для полного гибернации Set
/ List
из объекта DTO?
Нравится это?
Set<UserDTO> setDTO = .....
String hql = "FROM User WHERE id IN (:userDTO )";
Query query = entityManager.createQuery(hql);
query.setParameter("userDTO", setDTO);
return query.getResultList();
Спасибо
Ответ №1:
Почти. Но сначала вам нужно будет извлечь идентификаторы в отдельную коллекцию:
Set<Long> ids = new HashSet<Long>(setDTO.size());
for (UserDTO dto : setDTO) {
ids.add(dto.getId());
}
Затем выполните запрос и передайте ids
set как param .
Ответ №2:
Не забывайте, что вам нужно использовать Query#setParameterList() вместо Query#setParameter .
Комментарии:
1. я думаю, это будет работать в любом случае. хотя, если вы знаете, что это список (
Set
в данном случае это a), вам следует использовать более конкретный метод2. Возможно. Кажется, я помню, как изо всех сил пытался использовать коллекцию в setParameter. И да, setParameterList на самом деле принимает коллекцию!
3. Я только что попытался написать тест для каждого метода, и если вы передадите List<String> в setParameter, вы получите ClassCastException при выполнении запроса.
4. хм, возможно, вы правы. Или он не согласован между версиями
5. Вполне возможно, этот эксперимент был только для 3.6.7! Их гораздо больше!