2009-09-11 6 views
6

рассмотрим таблицуобъект на карте, используя запрос в Hibernate

sales (id, seller_id, amount, date) 

и здесь вид, который генерируется из sales с помощью запроса SELECT seller_id, SUM(amount) FROM sales GROUP BY seller_id

total_sales (seller_id, amount) 

Я хочу, чтобы сделать объект для общего объема продаж, но без вид на стороне SQL.

Этот объект будет создан из запроса. Самое близкое, что я нашел, это this, но я не мог заставить его работать.

Даже если я определяю загрузчик, hibernate ищет таблицу сущности и дает ошибку, если она не может найти ее. Если я создам таблицу, она не загружает объект из заданного мной запроса, Hibernate генерирует сам запрос.

Есть ли способ заставить @Loader работать или есть другой способ, которым я могу сопоставить запрос с сущностью?

+1

Вы не сможете заставить 'session.createCriteria (TotalSales.class)' работать через пользовательский загрузчик. Вы не можете (а также не должны) сопоставлять его как объект без наличия в базе данных объекта базы данных (таблицы или представления). – ChssPly76

ответ

18

Почему бы вам просто не использовать new в запросе?

select new TotalSales(seller_id, count(seller_id)) 
from sales 
group by seller_id 

Вы просто пишете класс TotalSales с помощью конструктора, принимающего seller_id и целое число.


Edit: При использовании критериев API, вы можете использовать AliasToBeanResultTransformer (см API docs). Он копирует каждое имя псевдонима в свойство с тем же именем.

List list = s.createCriteria(Sales.class) 
    .setProjection(Projections.projectionList() 
    .add(Projections.property("id"), "SellerId") 
    .add(Projections.rowCount("id"), "Count")) 
    .setResultTransformer( 
    new AliasToBeanResultTransformer(TotalSales.class)) 
    .list(); 

Тогда ваш TotalSales нуждается в SellerId и Count недвижимости.

+0

+1 для хорошего первого ответа. – KLE

+0

Потому что я хочу использовать новую сущность, как 'session.createCriteria (TotalSale.class) .list()' – nimcap

+0

Добавить добавленный раздел для моего ответа для критериев. –

0

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

SELECT seller_id, SUM(amount) FROM sales GROUP BY seller_id 

Результат, естественно, хранится в списке. Если этот тип данных не очень удобно для вас, вы можете:

  • создавать новые объекты TotalSale с ними (используйте ответ Стефана был бы лучше, наверное)
  • создать карту для хранения данных (вы также можете встроить это непосредственно в запрос).
0

Вы можете попытаться определить индивидуальный погрузчик. Я никогда не использовал это, но это кажется разумным:

<sql-query name="totalSale"> 
    <return alias="ts" class="TotalSale" /> 
    SELECT seller_id as {ts.seller_id}, SUM(amount) as ts.amount 
    FROM sales 
    WHERE seller_id = ? 
    GROUP BY seller_id 
</sql-query> 

Не уверен, что фильтр на продавце необходим.

Вы ссылку на этот именованный запрос в отображении класса:

<class name="TotalSale"> 
    <id name="seller_id"> 
     <generator class="increment"/> 
    </id> 
    <property name="seller_id" /> 
    <property name="amount" /> 
    <loader query-ref="totalSale"/> 
</class> 

Есть more details in the manual.

В качестве альтернативы вы можете напрямую использовать запрос имени из кода, так что вам не нужно сопоставление TotalSale и не нужно писать запрос в коде. Именованные запросы также могут возвращать объекты. См. details about named queries в документации.

+0

Это никак не поможет с 'session.createCriteria()'. – ChssPly76

+0

Я действительно сомневаюсь, что createCriteria настоятельно необходимо в этом случае, поэтому я предлагаю альтернативные подходы. –

+0

Да, и я - проголосовал за ваш другой ответ. – ChssPly76

0

, если вы действительно хотите конкретный объект только для этой работы вы можете использовать «формулу» на настраиваемого свойства

<class name="SellerSales" table="Sales" lazy="true"> 
    <id name="SellerId" column="SellerId" type="int"> 
     <generator class="native" /> 
    </id> 
    <property name="SalesSum" type="float" update="false" insert="false" 
      formula="select SUM(sal.ammount) from sales sal where sal.seller_id = SellerId)" /> 
</class> 

public class SellerSales 
{ 
    public int SellerId {get; set;} 
    public float SalesSum {get; set;} 
} 

как таковой его подъезд к Criteria двигателя для заказа, по-ых, ограничения и т.д., которые я думаю, причина, по которой вы хотите ее использовать.

+0

Это не сработает, если таблица «Продавец» не существует и не привязана к какому-либо другому объекту. И если бы это было так, то все дело спорно. – ChssPly76

+0

На самом деле, у меня есть ошибка в ошибках в сообщении, единственная причина, по которой я опубликовал, - это, возможно, тема-стартер получает идею или предоставляет некоторую информацию о том, что ему действительно нужно. иначе ответ Стефана кажется правильным – Jaguar