Вычисляемое свойство с JPA / Hibernate
мой Java bean имеет свойство childCount. Это свойство не сопоставляется со столбцом базы данных. Вместо этого, он должен быть!--3-->вычисляется по базе данных с помощью COUNT() функции работает на соединении моего Java bean и его дочерних элементов. Было бы еще лучше, если бы это свойство можно было рассчитать по требованию / "лениво", но это не обязательно.
в худшем случае я могу установить свойство этого компонента с помощью HQL или API критериев, но я бы предпочел не надо.
Спящий Режим @Formula аннотация может помочь, но я едва мог найти какую-либо документацию.
любая помощь очень ценится. Спасибо.
2 ответов:
JPA не предлагает никакой поддержки для производного свойства, поэтому вам придется использовать определенное расширение поставщика. Как вы упомянули,
@Formulaидеально подходит для этого при использовании Hibernate. Вы можете использовать фрагмент 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 производные свойства-производительность и Портативность.
без более подробной информации я не могу дать более точный ответ, но приведенная выше ссылка должна быть полезной.
Читайте также:
- раздел 5.1.22. Элементы столбца и формулы (Hibernate Core documentation)
- раздел 2.4.3.1. Формула (Hibernate аннотации документации)
как поясняется в в этой статье, у вас есть три варианта:
- либо вы вычисляете атрибут с помощью
@Transientметод- вы также можете использовать
@PostLoadentity listener- или вы можете использовать Hibernate specific
@Formulaаннотациив то время как спящий режим позволяет использовать @ Formula, С JPA, вы можете использовать @PostLoad обратный вызов для заполнения a транзиторная свойство с результатом некоторого вычисления:
@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;
Comments