Hibernate - хорошие подходы для агрегирования данных и их преобразования в новые объекты - PullRequest
0 голосов
/ 06 декабря 2011

Мне нужно было бы объединить определенные данные, хранящиеся в базе данных через Hibernate, поэтому я хотел бы использовать HQL для получения нужных мне данных.

Transaction
    id
    userEmail
    moneyPaid

Теперь .. каков наилучший способ агрегировать все MoneyPaid пользователем, определенным userEmail. Я хотел бы получить обратно объекты, которые будут иметь электронную почту пользователя с агрегированным свойством moneyPayd.

Какой самый лучший и самый элегантный способ сделать это?

И, возможно, если у меня есть другая сущность, скажите Пользователь:

User
    id
    email
    address

Есть ли какой-нибудь удобный способ, не включающий много кода, который бы присоединял пользователя к транзакции, агрегировал moneyPaid и возвращал список сущностей совершенно другого типа, например:

AggregatedData
    email
    totalMoneyPaid
    address

Я знаю несколько способов сделать это, но они очень элегантны и лаконичны, любые идеи приветствуются.

Ответы [ 3 ]

5 голосов
/ 06 декабря 2011
select u.email, sum(t.moneyPaid), u.address from Transaction t 
left join t.user u
group by u.email, u.address;

Я согласен с этим запросом, если вы не хотите List<Object[]> в качестве возврата, вы можете написать это:

select new org.sample.RequestResult(u.email, sum(t.moneyPaid), u.address) from Transaction t
left join t.user u
group by u.email, u.address;

Создать объектorg.sample.RequestResult с конструктором String email, Long (или другим, тип поля вашей сущности) moneyPaid и String address

Запрос вернет List<RequestResult>

Вы можете простонапишите select new map(...) который вернет карту из псевдонимов к выбранным значениям

1 голос
/ 06 декабря 2011
select u.email, sum(t.moneyPaid), u.address from Transaction t 
left join t.user u
group by u.email, u.address;

Чтобы это работало, сущность Transaction должна иметь не свойство userEmail, а ассоциацию ManyToOne с сущностью User.

Ссылка hibernate содержит все, что вам нужно знать об ассоциациях и агрегатных функциях. Очевидно, они похожи на агрегатные функции SQL.

Обратите внимание, что в приведенном выше запросе не возвращаются объекты, а List<Object[]>, каждый из которых Object[] содержит три элемента: электронная почта, общая сумма уплаченных денег и адрес. До вас, чтобы перебрать список и создать список AggregatedData экземпляров.

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

Вы имеете в виду, что хотите использовать HQL для запроса результата? Если это так, я думаю, что группа по заявлению в HQL подойдет.

select t.userEmail, sum(t.moneyPaid)
from Transaction t
group by t.userEmail

Я не уверен, что возвращаемый тип (вы можете отладить, чтобы найти его). Но я думаю List<List<Object>> может сработать. (оно слабо набрано, поэтому перед использованием его необходимо выполнить приведение вниз)

см. Сайт Hibernate: Запрос с HQL

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