考虑表
sales (id, seller_id, amount, date)
这里是从生成的图sales
使用查询SELECT seller_id, SUM(amount) FROM sales GROUP BY seller_id
total_sales (seller_id, amount)
我想打一个实体的销售总额,但没有SQL一边的看法。
这个实体会从查询构造。 我发现的最接近的是这个 ,但我不能使它工作。
即使我定义了装载机,休眠查找实体的表,给出了一个错误,如果它不能找到它。 如果我创建表不会从我所定义的命名查询加载实体时,Hibernate生成查询本身。
有没有一种方法,使@Loader工作或者是没有办法,我可以映射查询实体另一种方式?
你为什么不只是使用new
的查询?
select new TotalSales(seller_id, count(seller_id))
from sales
group by seller_id
你只写一个构造函数取seller_id和整数类TotalSales。
编辑 :如果使用标准的API,你可以使用AliasToBeanResultTransformer
(见API文档 )。 它复制每一个别名同名的属性。
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
财产。
除了Stefan的回答,你也可以使用一个明确的HQL查询
SELECT seller_id, SUM(amount) FROM sales GROUP BY seller_id
其结果自然是存储在列表中。 如果该数据类型是不是你方便,你可以:
- 与他们建立新的TotalSale对象(使用斯特凡的答案会是更好的可能)
- 创建一个映射到存储数据(你也可以嵌入此直接进入请求)。
您可以尝试定义一个定制的装载机。 我从来没有使用过这一点,但它似乎是合理的:
<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>
如果需要在seller_id过滤器不能确定。
你引用一个类映射此命名查询:
<class name="TotalSale">
<id name="seller_id">
<generator class="increment"/>
</id>
<property name="seller_id" />
<property name="amount" />
<loader query-ref="totalSale"/>
</class>
有手册中更多的细节 。
或者,你可以直接使用从代码名称查询,这样就不需要TotalSale的映射,并没有写在代码中查询。 命名查询也可以返回对象。 请参阅有关命名查询的详细信息的文档。
如果你真的想要一个特定的实体只有这份工作,你可以使用一个“公式”关于自定义属性
<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;}
}
因此,其入店的标准发动机的订单通过的,限制等我认为这是你想使用它的原因。