обработка результатов запроса hibernate

243
16 сентября 2017, 23:17

Начинаю изучать java. Подскажите, т.к. уже облазил кучу статей, а решения так и не нашел. Ощущение, что начинаю все больше и больше запутываться.

Есть следующий класс:

@Entity
@Table(name = "CalendarResPlan")
public class CalendarResPlanSet implements Serializable { 
     @Id
     @Column(name = "id")
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
     @Column(name = "day")
     @Temporal(value=TemporalType.DATE)
     private Date day;
     @Column(name = "idRes")
     private String idRes;
     @Column(name = "needTime")
     private Long needTime;
     @Column(name = "idOperation")
     private String idOperation;

Делаю выборку следующим образом:

        Query query = session.createQuery("SELECT "
                                        + "SUM(R.needTime), "
                                        + "R.day, "
                                        + "R.idRes "
                                        + "FROM "
                                        + "CalendarResPlanSet R "
                                        + "WHERE R.day = :day "
                                        + "AND R.idRes = :idRes "
                                        + "GROUP BY "
                                        + "R.day, "
                                        + "R.idRes");
        query.setParameter("day", day);
        query.setParameter("idRes", idRes);
CalendarResPlanSet planSet = (CalendarResPlanSet) query.uniqueResult();

Преобразование не получается. Выдает следующее сообщение: cannot be cast to base.dataSets.CalendarResPlanSet

Answer 1

Если вы хотите использовать агрегатные функции в HQL/JPQL, то у вас есть два варианта получения результатов:

  1. Получения списка массивов объектов - List<Object[]>. Элемент списка - это строка, элемент массива - поле в строке:

    Query query = session.createQuery("SELECT "
                                    + "SUM(R.needTime), "
                                    + "R.day, "
                                    + "R.idRes "
                                    + "FROM "
                                    + "CalendarResPlanSet R "
                                    + "WHERE R.day = :day "
                                    + "AND R.idRes = :idRes "
                                    + "GROUP BY "
                                    + "R.day, "
                                    + "R.idRes");
    query.setParameter("day", day);
    query.setParameter("idRes", idRes);
    List<Object[]> data = query.list();
    if (data.size() > 0) {
        Long needTimeSum = data.get(0)[0];
        ...
    }
    
  2. Создание объектов в запросе:

    @Entity
    public class CalendarResPlanSet {
        ...
        public CalendarResPlanSet(Date day, String idRes, Long needTime) {
            this.day = day;
            this.idRes = idRes;
            this.needTime = needTime;
        }
        ...
    }
    Query query = session.createQuery("SELECT "
                            + "new CalendarResPlanSet("
                            + "R.day, "
                            + "R.idRes, "
                            + "SUM(R.needTime)"
                            + ") "
                            + "FROM "
                            + "CalendarResPlanSet R "
                            + "WHERE R.day = :day "
                            + "AND R.idRes = :idRes "
                            + "GROUP BY "
                            + "R.day, "
                            + "R.idRes");
    query.setParameter("day", day);
    query.setParameter("idRes", idRes);
    CalendarResPlanSet calResPlanSet = (CalendarResPlanSet) query.uniqueResult();
    

    Только учтите, что полученная сущность будет в состоянии transient и инициализирована не полностью.

READ ALSO
Не создается файл на диске [требует правки]

Не создается файл на диске [требует правки]

Знакомлюсь с графическим интерфейсом Java SwingПоявилась такая проблема: при нажатии на кнопку должен создаваться файл на диске, а он создается...

174
Нужно ли всегда проверять аргументы на null

Нужно ли всегда проверять аргументы на null

Здравствуйте! Есть такой вот вопрос - нужно ли всегда поверять аргументы на null? наподобие:

165
Переделать код из Java в Delphi

Переделать код из Java в Delphi

Требуется скопировать небольшую функцию с Java (Android Studio) на Delphi, для этого необходимо функцию эту переделать немного так как синтаксис отличаетсяСтолкнулся...

178
Обфускация Java приложения

Обфускация Java приложения

У меня есть старенький лаунчер для игрыНо там очень хлипкая защита

174