JPQL Order By Average из второй таблицы - PullRequest
2 голосов
/ 19 декабря 2010

Фон

У меня есть два объекта, сохраненных с помощью Hibernate. Продукт и голосование.

Объект Product содержит список голосов, например

public class Product {
    @javax.persistence.Id
    @javax.persistence.GeneratedValue
    public Long id;  

    String name;
    @OneToMany(mappedBy = "product", cascade = CascadeType.ALL)
    List<Vote> votes;
}

объект голосования просто содержит оценку и двунаправленную ссылку на товар.

public class Vote {
    @javax.persistence.Id
    @javax.persistence.GeneratedValue
    public Long id; 

    Short score;
    @ManyToOne
    Product product;
}

Это отлично работает, и в моей базе данных я вижу продукты и голоса, как и ожидалось. Теперь я хочу написать JPQL-запрос, чтобы упорядочить продукты в порядке наибольшего среднего числа голосов.

Я добился этого с помощью простого SQL следующим образом

select p.name
from product p
order by (select avg(score) from vote v where p.id = v.product_id) desc;

Вопрос

Я не могу заставить это работать в моем запросе JPQL. Я просто получаю сообщение об ошибке "unexpected AST node".

JPQL, который я использую, -

select p from Product p 
order by (select avg(score) from Vote v where p.id = v.product) desc

JPQL не поддерживает внутренние операторы выбора?

1 Ответ

4 голосов
/ 19 декабря 2010

Это может сработать:

SELECT p FROM Product p LEFT JOIN P.votes v
  GROUP BY p ORDER BY AVG(v.score) desc
...