2011-07-19 17 views
0

私はエンティティを持っています:注文の詳細。これは次のように次のようになります。基準と予測

@ManyToOne 
public Product getProduct() { 
    return this.product; 
} 
public void setProduct(Product product) { 
    this.product = product; 
} 

@Column(name="amount",nullable = false) 
public int getAmount() { 
    return this.amount; 
} 
public void setAmount(int amount) { 
    this.amount= amount; 
} 

@Transient 
public void setSum_amount(double sum_amount){ 
    this.sum_amount=sum_amount; 
} 

私が注文の詳細テーブルに注文の詳細、製品によってグループ、および各製品の量のリストを取得しようとしています。

これ

はそれを行うには、私のコードです:

session=sessionFactory.openSession(); 
    List<OrderDetail> od=session.createCriteria(OrderDetail.class) 
    .setProjection(Projections.projectionList() 
      .add(Projections.sum("amount"),"sum_amount") 
      .add(Projections.groupProperty("product")) 
    ) 
    .setResultTransformer(Transformers.aliasToBean(OrderDetail.class)) 
    .list(); 
問題は私がやって、製品のプロパティにアクセスできないことである

「od.getProduct()のgetName()。」私は、NullPointerExceptionが取得どのように私はそれを修正することができますか?

答えて

0

注文の詳細のリストはなく、各注文の詳細グループの合計のリストが表示されています。したがって、SQLから数値を取得しています。したがって、私はあなたがsum_amountだけを持つ空のOrderDetail(トランスのために)オブジェクトのリストを得ていると思います。

あなたの問題は注文の詳細が全く異なるオブジェクトを取得していないため、現在のフォームでは解決できません。達成しようとしていることとその方法を再考する必要があります。

+0

私はちょうどより多くの量を持っている製品を注文詳細の表、ベストセラー製品を取得したい。 – cracq

+0

あなたの基準は 'OrderDetail.class'ではなく' Product.class'の上に構築されるべきです。結果は製品になります。あなたは望みの結果をもたらすSQLクエリーを構築しましたか?それから始めると、Hibernateクエリーを理解するのがずっと簡単になります。 –

+0

私はこれらの文の正しさについてはわかりません: 'Orderdetailからのod.idproduct Sum(od.amount)の選択od.idproduct order by Sum(od.amount)'または 'od.idproduct sum(od .amount)from OrderDetail od.idproduct order by sum(od.amount)=(OrderDetailからod.amountを選択し、od.idproduct order by 1 descで上位10個を選択) 'しかし、とにかく、 Criteriaを使ってそれを行う方法を知っています。 – cracq

0

Projectionsを使用して項目をグループ化すると、クエリから戻ってくるものを定義することになります。あなたの上記の例では、@ManyToOneの関連付けは初期化されていないので、2つの列を返すだけです。結果セットを取得したら、それをルーピングして、各レコードに対してHibernate.initializeを使用して関連付けをロードします。