考虑表
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工作,还是有另一种方法可以将查询映射到实体?
答案 0 :(得分:18)
为什么不在查询中使用new
?
select new TotalSales(seller_id, count(seller_id))
from sales
group by seller_id
您只需使用带有seller_id和整数的构造函数编写一个TotalSales类。
修改:使用条件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
属性。
答案 1 :(得分:0)
除了Stefan的回答,您还可以使用显式的HQL查询
SELECT seller_id, SUM(amount) FROM sales GROUP BY seller_id
结果自然存储在List中。如果此数据类型对您不方便, 你可以:
答案 2 :(得分: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>
不确定是否需要在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的映射,也不必在代码中编写查询。命名查询也可以返回对象。请参阅文档中的details about named queries。
答案 3 :(得分: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引擎的order-by,限制等,我认为这是你想要使用它的原因。