Вычисленное свойство с JPA / Hibernate
У моего Java-компонента есть свойство childCount. Это свойство не сопоставляется с столбцом базы данных . Вместо этого он должен быть рассчитан базой данных с помощью функции COUNT()
действующей на соединение моего Java-компонента и его дочерних элементов. Было бы еще лучше, если бы это имущество могло быть рассчитано по требованию / «лениво», но это не обязательно.
В худшем случае я могу установить свойство этого компонента с помощью HQL или API критериев, но я бы предпочел не делать этого.
Аннотации Hibernate @Formula
могут помочь, но я едва мог найти какую-либо документацию.
- Каково решение проблемы N + 1 в JPA и Hibernate?
- Какой ORM я должен использовать для Node.js и MySQL?
- Можно ли динамически определять имена столбцов в Hibernate / JPA?
- Почему django prefetch_related () работает только со всеми (), а не с фильтром ()?
- Подсоническое Vs NHibernate
Любая помощь очень ценится. Благодарю.
- Примитив или shell для первичных ключей спящего режима
- Ошибка: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter. (I) V
- Hibernate, iBatis, Java EE или другой инструмент Java ORM
- Entity Framework слишком медленная. Какие у меня варианты?
- Получение соединения с базой данных в чистой настройке JPA
- JPA CriteriaBuilder - Как использовать оператор сравнения «IN»
- Hibernate против JPA против JDO - плюсы и минусы каждого?
- Автоматическое резервирование зарезервированного слова для таблиц и столбцов Hibernate
JPA не предлагает поддержки для производного имущества, поэтому вам придется использовать расширение для конкретного поставщика. Как вы уже упоминали, @Formula
идеально подходит для этого при использовании Hibernate. Вы можете использовать fragment SQL:
@Formula("PRICE*1.155") private float finalPrice;
Или даже сложные запросы в других таблицах:
@Formula("(select min(o.creation_date) from Orders o where o.customer_id = id)") private Date firstOrderDate;
Где id
– id
текущего объекта.
Следующее сообщение в блоге стоит прочитать: Hibernate Derived Properties – Производительность и переносимость .
Без более подробной информации я не могу дать более точный ответ, но приведенная выше ссылка должна быть полезна.
Смотрите также:
- Раздел 5.1.22. Элементы столбца и формулы (документация Hibernate Core)
- Раздел 2.4.3.1. Формула (документация по гибернатной annotations)
Как объясняется в этой статье , у вас есть три варианта:
- либо вы вычисляете атрибут с помощью метода
@Transient
- вы также можете использовать
@PostLoad
- или вы можете использовать аннотацию
@Formula
Hibernate
В то время как Hibernate позволяет использовать @Formula , с JPA, вы можете использовать обратный вызов @PostLoad для заполнения свойства переходного процесса с результатом некоторых вычислений:
@Column(name = "price") private Double price; @Column(name = "tax_percentage") private Double taxes; @Transient private Double priceWithTaxes; @PostLoad private void onLoad() { this.priceWithTaxes = price * taxes; }
Для более сложных запросов вы можете использовать Hibernate @Formula
, как описано в этой статье :
@Formula( "round(" + " (interestRate::numeric / 100) * " + " cents * " + " date_part('month', age(now(), createdOn)" + ") " + "/ 12) " + "/ 100::numeric") private double interestDollars;