使用查询Hibernate的地图实体(Map entity using query in Hiber

2019-07-17 17:27发布

考虑表

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工作或者是没有办法,我可以映射查询实体另一种方式?

Answer 1:

你为什么不只是使用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需要SellerIdCount财产。



Answer 2:

除了Stefan的回答,你也可以使用一个明确的HQL查询

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

其结果自然是存储在列表中。 如果该数据类型是不是你方便,你可以:

  • 与他们建立新的TotalSale对象(使用斯特凡的答案会是更好的可能)
  • 创建一个映射到存储数据(你也可以嵌入此直接进入请求)。


Answer 3:

您可以尝试定义一个定制的装载机。 我从来没有使用过这一点,但它似乎是合理的:

<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的映射,并没有写在代码中查询。 命名查询也可以返回对象。 请参阅有关命名查询的详细信息的文档。



Answer 4:

如果你真的想要一个特定的实体只有这份工作,你可以使用一个“公式”关于自定义属性

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

因此,其入店的标准发动机的订单通过的,限制等我认为这是你想使用它的原因。



文章来源: Map entity using query in Hibernate