2016-12-09 3 views
0

Я создаю этот вопрос после 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 

Что я делаю неправильно?

Заранее благодарен!

+0

вам не нужно добавлять атрибут carule_type по вашим критериям. JPA добавляет его сам по себе, потому что вы говорите, что выбрали из carule ... try SELECT v FROM vehicleule v –

+0

i meened «SELECT v FROM Car v» ... «SELECT v FROM vehicleule v» работает только, если вы даете свой класс транспортных средств также дискриминатор. –

ответ

0

Я не могу видеть полные поля вашего объекта «vehicleule». Но если у вас есть на вашем VEHICULE таблице, имя поля «vehicule_type» Вы UST должны указать его в коде с именем «vehiculeType»

Просто попробуйте изменить «vehicule_type» на «vehiculeType»

Но для большей помощи я думаю, что вы должны предоставить контент класса вашего Vehicle Vehicle.

Приветствия

0

Есть ли поле с именем vehicule_type? Я сомневаюсь, что его нет, и каким-то образом вы пытаетесь получить доступ к нему, что вызывает исключение.

0

Вам никогда не нужно вставлять критерии для значений дискриминатора. JPA делает это сам. Вам просто нужно выбрать правильную сущность.

В вашем случае вы должны просто выбрать: «SELECT v FROM Car v». Если вы включите show_sql в своей конфигурации, вы увидите, что JPA добавляет, где aliasXX.vehicule_type = 'Car' автоматически

+0

Это просто сработало !!!! Спасибо большое !!! – Kiwi

+0

приветствуются –