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;
}
}