2013-10-03 3 views
1

Я ищу интеллектуальный способ преобразования этой инструкции SQL в @NamedQuery - если есть способ вообще?SQL to JPA @NamedQuery Conversion

SELECT MONTH(dateField), sum(value) FROM mydb.records where status ='paid' group by MONTH(dateField) order by MONTH(dateField); 

У меня есть JPA @Entity называется Record (Hibernate). Здесь указаны все счета-фактуры в системе, которые создаются ежедневно. В месяц будет много записей. Каждая запись будет иметь статус оплаченной, просроченной, стоимости и много другой информации, такой как имя и адрес клиента и т. Д.

Вышеуказанное заявление в основном суммирует все данные по месяцам и суммам стоимость всех оплаченных счетов в месяц giveing ​​сводку всех счетов-фактур, выплаченных в январе, все оплачено в феврале и так далее ..... результат выглядит нечто вроде:

datefield value 
1   4500 
2   5500 
3   5669 

единственный способ, которым я могу думать делая это с помощью JPA @NamedQuery, нужно выбрать все записи в таблице, которые имеют статус «pai'd», а затем использовать мой код Java для сортировки, упорядочивания и добавления в довольно медленном и уродливом виде! Есть ли способ сделать это с помощью @NamedQuery?

Благодаря

ответ

1

MONTH() не является стандартной функцией JPQL определены в спецификации JPA, однако есть альтернатива.

Сделайте представление в своей базе данных, которое использует функцию месяца ваших баз данных.

create view MONTLY_REVENUE as 
    SELECT MONTH(dateField), 
     sum(value) 
    FROM mydb.records 
    where status ='paid' 
    group by MONTH(dateField) 
    order by MONTH(dateField); 

Затем просто создайте этот объект, как и из любой другой таблицы с JPA. Вы можете выбрать из представления, но не сможете сохранить и обновить его, однако, поскольку вы используете агрегаты, это не так, как вы.

+0

Спасибо за быстрый ответ Kevin, выглядит великолепно и намного проще, чем мой цикл Java! Итак, этот новый «вид» автоматически сопоставляется с JPA '@' Entity MONTHLY_REVENUE {}, который я создаю? И тогда результат @ @ 'NamedQuery, который выберет все в новой' @ 'Entity MONTHLY_REVENUE, даст результаты? – user1843591

+0

@ user1843591 Точно. –

+0

Привет, Кевин, могу ли я добавить динамическое значение или динамический параметр в представление? например view as u описал..xxx, где status = 'paid' и где vendorid = $ {} .... Я слишком упростил свой первоначальный вопрос. Исходное решение объединяет все счета-фактуры для всех поставщиков. Я разрешаю продавцам входить в систему и просматривать их данные, но все они хранятся в одной таблице, поэтому я хотел бы только агрегировать на поставщике по принципу поставщика ... – user1843591

Смежные вопросы