2016-10-17 12 views
0

どのように投影内のネストされたエンティティを含む完全なエンティティを追加できますか?投影内のネストされたエンティティを持つ完全なエンティティを追加する

問題は、指定されたHQLをCriteria APIに変換する必要があります。

SELECT p FROM Product p LEFT JOIN p.reviews r GROUP BY p ORDER BY r.rating ASC 

1製品には多くのレビューがあります。 (1対多の関係)

プロジェクションを使用することには消極的です。プロダクトクラスには、熱心に取り出される他のエンティティがあります。製品クラスにはブランドエンティティがあります。 (多対1)。

可能であれば、私は最小限の投影コードを必要とします。

製品クラス

@Entity 
public class Product { 

    @Id 
    @GeneratedValue 
    private long id; 

    private String name; 

    @OneToMany(mappedBy = "product") 
    private Review review; 

    @ManyToOne 
    private Brand brand; 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Review getReview() { 
     return review; 
    } 

    public void setReview(Review review) { 
     this.review = review; 
    } 

    public Brand getBrand() { 
     return brand; 
    } 

    public void setBrand(Brand brand) { 
     this.brand = brand; 
    } 

} 

レビュー

@Entity 
public class Review { 

    @Id 
    @GeneratedValue 
    private long id; 

    private String text; 

    private int rating; 

    @ManyToOne 
    private Product product; 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public String getText() { 
     return text; 
    } 

    public void setText(String text) { 
     this.text = text; 
    } 

    public int getRating() { 
     return rating; 
    } 

    public void setRating(int rating) { 
     this.rating = rating; 
    } 

    public Product getProduct() { 
     return product; 
    } 

    public void setProduct(Product product) { 
     this.product = product; 
    } 

} 
+0

@NeilStockton。 Projections.avg( "review.rating")に沿ってgroupProperty( "product.id")を作成し、レビューの平均で並べ替えることができます。しかし、私は各フィールドを投影に追加する必要があります。 私の要件は簡単です。私は製品のリストを希望し、それらのレーティングの平均で注文したいと思います。 1製品には多くのレーティングがある可能性があります。 – Piyush

+0

この場合、JPA Criteria APIではないため、JPAタグを削除します。 –

+0

@ NeeStockStock Ok。上記のHQLのためのHibernate Criteriaを手伝ってもらえますか? JPA基準で可能な場合は、それも役立ちます。 – Piyush

答えて

0

あなたの問題は、挿入上にある場合は、親クラスにカスケード(CascadeType)を設定する必要があります。問い合わせは、何が必要である場合http://docs.oracle.com/javaee/6/tutorial/doc/bnbqa.html

、これは参加+オーダークエリの例として仕事ができる:

CriteriaQuery<Product> cq = cb.createQuery(Product.class); 
Root<Product> product= cq.from(Product.class); 
Join<Product, Review> review = product.join("review"); 
cq.select(product); 
cq.groupBy(review.get("rating")); 
cq.orderBy(cb.asc(cb.avg(review.get("rating")))); 

出典:私は、突起を使用することができ、私の知識で1としてhttp://docs.oracle.com/javaee/6/tutorial/doc/gjivm.html

+0

評価の平均で注文したい – Piyush

+0

私は答えを編集してグループを含めました。とにかく、私はCriteria APIを使う価値のあるリンクについてのリンクを考えています。 –

+0

ありがとう、私は休止状態を使用しています。私はHibernate SessionFactoryインスタンスを持っています。 EntityManagerインスタンスまたはCriteria Builderインスタンスを取得できますか?そうでない場合は、Hibernate Criteriaのコードを変更できますか? – Piyush

関連する問題