2016-10-17 4 views
0

Как добавить полный объект с вложенными объектами в проекции.Добавить полный объект с вложенными объектами в проекции

Проблема в том, что я хочу преобразовать данный HQL в API критериев.

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

Рассмотрите 1 Изделие имеет множество отзывов. (Отношение «один ко многим»)

Также я неохотно использую Projection, поскольку Product class имеет другие объекты, которые с нетерпением ожидают. например, класс продукта имеет бренд-сущность. (Много к одному).

Если возможно, я хочу минимальное количество проекционного кода.

Класс продукта

@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 По моему ведому я могу использовать проекции. groupProperty ("product.id") вдоль Projections.avg ("review.rating"), а затем я могу сортировать по среднему показателю. Но мне нужно будет добавить каждое поле в проекцию. Мое требование просто Я хочу список продуктов и хочу заказать их в среднем по их рейтингу. 1 Продукт может иметь много Rating – Piyush

+0

, и в этом случае это НЕ API-интерфейс JPA, следовательно, удаляет тег JPA. –

+0

@NeilStockton Ok. Можете ли вы помочь мне с критериями Hibernate для вышеупомянутого 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

Я отредактировал ответ так, чтобы он включал группу. Во всяком случае, я думаю, что ссылка на «Использование API критериев» стоит посетить. –

+0

Спасибо, я использую Hibernate. И у меня есть Hibernate SessionFactory. Могу ли я получить экземпляр EntityManager или экземпляр Criteria builder из него. Если нет, вы можете изменить код для критериев гибернации. – Piyush

 Смежные вопросы

  • Нет связанных вопросов^_^