Как получить запрос, используя функцию в критериях гибернации? - PullRequest
0 голосов
/ 29 декабря 2011

Мне нужно сгенерировать следующий запрос, используя критерии .. как это сделать?

select worker_id,date_format(date,'%m-%Y'),sum(SalaryPerDay),sum(attendance) from tbl_attendance
where worker_id is not null and  date_format(date,'%m-%Y') = date_format(now(),'%m-%Y')
group by worker_id, date_format(date,'%m-%Y')
order by date,worker_id

public class Attendance  {

    /**
     * 
     */
    private static final long serialVersionUID = 4917788836066742576L;
    private Integer attendanceId;
    private Date date;
    private Integer workerId;
    private Integer vehicleId;
    private Integer salaryId;
    private Double salaryPerDay;
    private Double attendance;
    private Double startingTime;
    private Double closingTime;

Ответы [ 2 ]

0 голосов
/ 29 декабря 2011

Во-первых, я бы, вероятно, не использовал критерии для этого.Критерии полезны, когда запрос должен генерироваться динамически на основе переменных критериев поиска.Ваш запрос полностью статичен, не возвращает сущности, но скаляры, и у вас уже есть.Почему бы просто не использовать SQL-запрос?Или, по крайней мере, HQL-запрос, если вы не хотите жестко кодировать имена таблиц и столбцов.

Если критерии по какой-то непонятной причине являются единственным приемлемым способом выполнения этого запроса, я бы не форматировалрезультат запроса в SQL.Я бы сделал это на Java, что, по крайней мере, упростило бы создание предложений select и group by.

Единственная сложная вещь - это формат даты.Но подождите, ваш запрос выбирает строки, которые все должны быть в текущем месяце.Все возвращенные строки будут иметь одинаковую форматированную дату.Итак, зачем выбирать его в первую очередь?

Таким образом, ваш запрос может быть переписан следующим образом:

select worker_id ,sum(SalaryPerDay), sum(attendance) from tbl_attendance
where worker_id is not null 
and date >= :startOfCurrentMonth, 
and date < :endOfNextMonth
group by worker_id
order by worker_id

И вдруг он становится простым для выполнения, в HQL или Критериях.

0 голосов
/ 29 декабря 2011

Вы не указали базу данных, но date_format, вероятно, не будет поддерживаться Hibernate из коробки.Если вы действительно хотите, чтобы это было сделано с помощью Criteria, вам, вероятно, потребуется реализовать собственный Criterion для сравнения и Projection для group by.

Вы также можете использоватьHQL с пользовательским диалектом, который вам нужно будет реализовать для поддержки date_format

. Возможно, вам лучше написать собственный SQL-запрос здесь.Hibernate предлагает все, что вам нужно для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...