Я создаю этот вопрос после 2-го исследования напрасно.JPA select query
Я пытаюсь сделать очень простой код местоположения автомобиля, который мог бы сэкономить, удалить данные из базы данных.
Итак, моя проблема заключается в том, что у меня есть родительский класс с именем vehicleule и 2 children class: car and van. Ниже, есть начало моих 3 классов
// vehicule
@Entity
@Table(name="Vehicule")
@DiscriminatorColumn(name="vehicule_type")
@Inheritance
public class Vehicule implements Serializable{
// some constructors setters and getters here
}
// car
@Entity
@DiscriminatorValue("Car")
public class Car extends Vehicule{
@Column(name = "number_of_seats")
private int nbOfSeats;
// some constructors setters and getters here
}
// van
@Entity
@DiscriminatorValue("Van")
public class Van extends Vehicule{
@Column(name = "max_weight")
private int maxWeight;
// some constructors setters and getters here
}
Я хранил их в одной таблице с inheritanceStratregy = одной таблицы. Теперь я хотел бы выбрать только автомобили или только фургоны.
Я попытался
Query query = em.createQuery("SELECT v FROM Vehicule v WHERE v.vehicule_type = 'Car'");
List<Car> list = (List<Car>) query.getResultList();
, но я получил
Caused by: java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager:
The state field path 'v.vehicule_type' cannot be resolved to a valid type.
Я также попытался
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Car> q = cb.createQuery(Car.class);
Root<Car> c = q.from(Car.class);
ParameterExpression<String> p = cb.parameter(String.class);
q.select(c).where(cb.equal(c.get("vehicule_type"), p));
TypedQuery<Car> query = em.createQuery(q);
query.setParameter(p, "Car");
List<Car> results = query.getResultList();
, но я получил
Caused by: java.lang.IllegalArgumentException: The attribute [vehicule_type] is not present in the managed type
Что я делаю неправильно?
Заранее благодарен!
вам не нужно добавлять атрибут carule_type по вашим критериям. JPA добавляет его сам по себе, потому что вы говорите, что выбрали из carule ... try SELECT v FROM vehicleule v –
i meened «SELECT v FROM Car v» ... «SELECT v FROM vehicleule v» работает только, если вы даете свой класс транспортных средств также дискриминатор. –