7

テーブルを考慮する

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 を機能させる方法はありますか、またはクエリをエンティティにマップする別の方法はありますか?

4

4 に答える 4

19

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

于 2009-09-11T12:02:45.537 に答える
0

Stefan の回答に加えて、明示的な HQL クエリを使用して

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

結果は当然 List に格納されます。このデータ型が都合が悪い場合は、次のことができます。

  • それらを使用して新しいTotalSaleオブジェクトを作成します(Stefanの回答を使用する方がおそらく良いでしょう)
  • データを保存するマップを作成します (これをリクエストに直接埋め込むこともできます)。
于 2009-09-11T12:12:03.267 に答える
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;}
}

そのため、オーダーバイ、制限などの基準エンジンにアクセスできるため、使用したい理由だと思います。

于 2009-09-18T11:27:12.660 に答える
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 のマッピングは必要なく、コードにクエリを記述する必要もありません。名前付きクエリもオブジェクトを返すことができます。名前付きクエリの詳細については、ドキュメントを参照してください。

于 2009-09-18T07:04:30.560 に答える