2016-10-17 38 views
0

如何在投影中添加具有嵌套實體的完整實體。在投影中添加具有嵌套實體的完整實體

問題是我想將給定的HQL轉換爲Criteria API。

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

考慮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按我knowlege我可以使用預測。 groupProperty(「product.id」)沿Projections.avg(「review.rating」),然後我可以按平均審覈進行排序。但我必須在投影中添加每個字段。 我的要求很簡單,我想要產品列表,並希望按他們的評級平均排序。 1產品可能有多個評級 – Piyush

+0

,在這種情況下,這不是JPA Criteria API,因此刪除了JPA標記。 –

+0

@NeilStockton好的。你能幫助我使用Hibernate Criteria來獲得上述HQL。 或者如果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")))); 

來源:http://docs.oracle.com/javaee/6/tutorial/doc/gjivm.html

+0

我想按平均評分 – Piyush

+0

我編輯了答案,因此它包含了分組。無論如何,我認爲關於使用Criteria API的鏈接值得一看。 –

+0

謝謝,我正在使用Hibernate。我有Hibernate SessionFactory實例。我可以從中獲取EntityManager實例或Criteria構建器實例嗎?如果不是的話你可以修改Hibernate Criteria的代碼嗎? – Piyush