Вычисленное свойство с JPA / Hibernate

У моего Java-компонента есть свойство childCount. Это свойство не сопоставляется с столбцом базы данных . Вместо этого он должен быть рассчитан базой данных с помощью функции COUNT() действующей на соединение моего Java-компонента и его дочерних элементов. Было бы еще лучше, если бы это имущество могло быть рассчитано по требованию / «лениво», но это не обязательно.

В худшем случае я могу установить свойство этого компонента с помощью HQL или API критериев, но я бы предпочел не делать этого.

Аннотации Hibernate @Formula могут помочь, но я едва мог найти какую-либо документацию.

Любая помощь очень ценится. Благодарю.

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; 

Где idid текущего объекта.

Следующее сообщение в блоге стоит прочитать: 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; 
  • Каковы преимущества использования ORM?
  • NHibernate vs LINQ to SQL
  • Минимальный и правильный способ сопоставления «один ко многим» с NHibernate
  • В чем разница между однонаправленными и двунаправленными ассоциациями JPA и Hibernate?
  • Указание индекса (не-уникальный ключ) с использованием JPA
  • Когда и почему сущности JPA должны реализовывать интерфейс Serializable?
  • JPA CascadeType.ALL не удаляет сирот
  • Что такое «собственная сторона» в сопоставлении ORM?
  • session.connection () не рекомендуется в Hibernate?
  • Использование Hibernate последовательности PostgreSQL не влияет на таблицу последовательности
  • Перечисление карты в JPA с фиксированными значениями?
  • Давайте будем гением компьютера.