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



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



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



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



любая помощь очень ценится. Спасибо.

789   2  

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 производные свойства-производительность и Портативность.

без более подробной информации я не могу дать более точный ответ, но приведенная выше ссылка должна быть полезной.

Читайте также:

как поясняется в в этой статье, у вас есть три варианта:

  • либо вы вычисляете атрибут с помощью @Transient метод
  • вы также можете использовать @PostLoad entity 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

    Ничего не найдено.