Запрос HQL, когда POJO не является релевантным или доступным

#java #hibernate #orm #hql #hibernate-mapping

#java #переход в спящий режим #orm #hql #переход в спящий режим-сопоставление

Вопрос:

Я пытаюсь выполнить следующий запрос HQL :

  select count(*) , od.itemSubtype.name from OrderDetails od inner join od.itemSubtype where od.employee = 1 group by od.itemSubtype
  

Мои POJO :

  OrderDetails 
 -------------
 private Integer id;
 private Employee employee;
 private Order order;
 private ItemSubtype itemSubtype;
 private Integer quantity;
 private String imageStyle;
 private String imageCapture;
 private Date workStartedOn;
 private Date workFinishedOn;


 ItemSubtype 
 -----------     
 private Integer id;
 private ItemType itemType;
 private String name;
 private Set orderDetailses = new HashSet(0);
 private Set measuresBooks = new HashSet(0);
  

Поскольку запрос не может привести к приведению существующего Pojo, я не могу повторно получить результат. Как я могу выполнить этот запрос? Нужно ли мне писать новый Pojo? Также как мне получить данные из итерации?

       Query query = session.createQuery(hql);

       // query.setParameter("employee_id", employee_id);

        Iterator i = query.iterate();
         while (i.hasNext()) {
            Object obj = i.next();
           // how to retrive values from this obj??
         }
  

Комментарии:

1. Запрос должен возвращать, List<Object[]> который вы можете легко повторить с помощью forEach цикла или иным образом с помощью Iterator with while цикла.

Ответ №1:

Вот как вы можете получить результаты:

 Query query = session.createQuery("""
    select 
        count(ist.id), 
        ist.name 
    from OrderDetails od 
    inner join od.itemSubtype ist 
    where od.employee = 1 
    group by ist.name
    """
);

for(Object rows : query.list()){
    Object[] row = (Object[]) rows;
    Number count = (Number) row[0];
    String itemSubTypeName = (String) row[1];
}