考虑表

sales (id, seller_id, amount, date)

和这里被认为是产生从 sales 使用的查询 SELECT seller_id, SUM(amount) FROM sales GROUP BY seller_id

total_sales (seller_id, amount)

我想做一个实体用于销售总量但没有看sql侧。

这个实体将构成从一个查询。最近的事情是我发现 , 但我不能让它工作。

甚至如果我定义的加载程序,休眠看起来对该实体的表格并提供了一个错误,如果它找不到它。如果我创建表不负荷的实体从名查询我定义、休眠产生查询本身。

是否有办法使@装载工作,或是有另一种方式,我可以查询的实体?

有帮助吗?

解决方案

为什么不在查询中使用 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 属性。

其他提示

除了斯特凡的答案,你也可以使用的一个非常明确的查询

    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;}
}

因为它可以访问Criteria引擎的order-by,限制等,我认为这是你想要使用它的原因。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top