Перевести в спящий режим вложенный выбор с помощью подзапроса

#hibernate #subquery #hibernate-criteria

#спящий режим #подзапрос #спящий режим-критерии

Вопрос:

Мне нужно создать критерии гибернации, которые будут вызывать этот SQL-запрос

 SELECT *, (SELECT avg(rating) FROM restaurant_review WHERE restaurant_id = restaurant.id) as "avegrageRating" FROM restaurant;
  

Пожалуйста, помогите: D

Редактировать: Вот сущности:

Restaurant.java:

 @Entity
@Table(name = "restaurant")
public class Restaurant {

    @Id
    @Column(name = "id")
    public int id;

    @Column(name = "name")
    public String name;

    @Column(name = "description")
    public String description;

    @OneToMany(mappedBy = "restaurantId")
    public List<RestaurantReview> reviews;
}
  

RestaurantReview.java

 @Entity
@Table(name = "restaurant_review")
public class RestaurantReview {

    @Id
    @Column(name = "id")
    public Integer id;

    // This Many to One causes an Unable to build entity manager factory exception
    @ManyToOne
    @JoinColumn(name = "restaurant_id", referencedColumnName="id")
    public Integer restaurantId;

    @Column(name = "user_id")
    public Integer userId;

    @Column(name = "rating")
    public Integer rating;
}
  

Я надеюсь, что это поможет.
Мне нужно получить список ВСЕХ ресторанов в таблице ресторанов с дополнительным столбцом, содержащим средний рейтинг из другой таблицы.

Ответ №1:

Поскольку вы не упомянули здесь свою сущность, поэтому, предполагая, что ваша сущность, которую я создал, приведенный ниже код, пожалуйста, проверьте… Надеюсь, это вам поможет.

 Session session=getSession();
    Criteria criteria = session.createCriteria(Restaurant.class);
    criteria.setProjection(Projections.projectionList().add(Projections.property("restaurant_review.restaurant_id"),"restaurant_id")
.add(Projections.property("restaurant_review.restaurant_name"),"restaurant_name")
            .add(Projections.alias(Projections.avg("rating"), "rating")).add(Projections.groupProperty("restaurant_review")));
    criteria.setResultTransformer(Transformers.aliasToBean(RestaurantPojo.class));  // Create a class having property name mention right sided as above 
    return (List<RestaurantPojo>)criteria.list();
  

Комментарии:

1. Я отредактировал вопрос, чтобы включить гораздо более подробную информацию. Пожалуйста, проверьте это

2. где находится ваш ссылочный столбец в RestaurantReview .. например: @manytoone в ресторан

3. когда я добавляю @ManyToOne @JoinColumn(name = «restaurant_id», referencedColumnName =»id»), я не могу создать исключение entity manager factory