Набор объектов HQL из набора

#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! Их гораздо больше!