Как заполнить поле сущности отдельной очередью в Hibernate? - PullRequest
1 голос
/ 08 августа 2010

У меня есть сущность, скажем

@Entity
public class Category {

  private String name;

  private int usersInCategory;
}

Я хочу заполнить поле usersInCategory неким агрегирующим SQL-запросом (select count(*) ... group by ...).

Как я могу сделать это в Hibernate?

Ответы [ 2 ]

2 голосов
/ 09 августа 2010

Используйте Formula (это специфическая аннотация Hibernate). Из документации:

2.4.3.1. Формула

Иногда вы хотите, чтобы база данных некоторые вычисления для вас, а не в JVM вы также можете создать вид виртуальной колонки. Вы можете использовать Фрагмент SQL (формула) вместо сопоставление свойства в столбце. это вид собственности только для чтения (его значение рассчитывается по вашей формуле фрагмент).

@Formula("obj_length * obj_height * obj_width")
public long getObjectVolume()

Фрагмент SQL может быть таким сложным, как Вы хотите и даже включить подвыборы.

Как пишет документация, фрагмент SQL может быть довольно сложным и может ссылаться на объект-владелец, как в примере ниже (столбец id без псевдонима в части o.customer_id=id предложения where ссылается на столбец-объект-владелец) :

@Formula("(select coalesce(extract ('day' from age(max(o.creation_date))), 9999) from Orders o where o.customer_id = id)")
private int daysSinceLastOrder;

Смотри также

0 голосов
/ 10 августа 2010

Другим способом, который был найден, является следующий запрос для получения:

select c, (select count(i) from Item i where c = i.category) from Category c

Будет создан список кортежей (Category, items_count). Первоначальная задача по инициализации поля сущности не будет выполнена таким образом, но она будет более эффективной, если вам не нужно всегда иметь это поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...