JPA hibernate: инициализация сущности, которая имеет больше атрибутов относительно полей таблицы

Есть некоторая SQL-таблица product(id, cost, count) и Java-сущность Product(это пример, по тому конструктор без аргументов и прочие настройки опущу):

@Entity
@Data
public class Product {
    @Id
    private Long id;
    private Integer cost;
    private Integer count;
    
    @Column(insertable = false)
    private Integer price;

    public Product(Integer cost, Integer count) { 
        this.cost = cost;
        this.count = count;
        this.price = cost * count;
    }
}

Идея в том, что таблица product не содержит поля price, -- оно инициализируется в сущности путём произведения данных из других столбцов таблицы. Проблема: при попытке получить все записи таблицы получаю SQLException.

Метод получения всех записей:

public List<E> findAll() { 
    var criteria = entityManager.getCriteriaBuilder().createQuery(clazz);
            criteria.from(clazz);
            return entityManager.createQuery(criteria)
                    .getResultList();
}

Также реализация через HQL(выдаёт тот же SQLException):

public List<Product> findAll() {
        return super.getEntityManager().createQuery(
                "SELECT p.id, p.cost, p.count FROM Product p", Product.class).getResultList();
}

Подскажите, пожалуйста, как быть?


Ответы (1 шт):

Автор решения: Виталий Турков

В вашем случае нужно использовать аннотацию Transient на поле price, чтобы оно не мапилось на таблицу и возвращать price в get-методе.


    @Entity
    @Data
    public class Product {
        @Id
        private Long id;
        private Integer cost;
        private Integer count;
        
        @Transient
        private Integer price;
    
        public Product(Integer cost, Integer count) { 
            this.cost = cost;
            this.count = count;
            this.price = cost * count;
        }
        
        public Integer getPrice() {
            return cost * count;
        }
    }

→ Ссылка