2016-12-09 5 views
0

Ich erstelle dieses Thema nach 2 Stunden Forschung umsonst.JPA Abfrage auswählen

Ich versuche, eine sehr einfache Auto Standortcode, der speichern konnte, entfernen Daten aus der Datenbank zu entfernen.

Also mein Problem ist, ich habe eine Elternklasse namens Vecicule und 2 Kinder-Klasse: Auto und Van. Unten gibt es den Anfang meiner drei Klassen

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

ich sie in einer einzigen Tabelle mit inheritanceStratregy = single-Tabelle gespeichert. Jetzt möchte ich nur Autos oder nur Vans auswählen.

Ich versuchte

Query query = em.createQuery("SELECT v FROM Vehicule v WHERE v.vehicule_type = 'Car'"); 
List<Car> list = (List<Car>) query.getResultList(); 

aber ich habe

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. 

Ich habe auch versucht

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(); 

aber ich habe

Caused by: java.lang.IllegalArgumentException: The attribute [vehicule_type] is not present in the managed type 

Was mache ich falsch?

Vielen Dank im Voraus!

+0

Sie müssen nicht Fahrzeug_Typ in Ihren Kriterien anfügen. JPA hängt es selbst an, weil Sie sagen, aus Vehicule wählen ... versuchen SELECT v FROM Vehicule v –

+0

ich empfange "SELECT v VON Auto v" ... "SELECT v FROM Vehicule v" funktioniert nur, wenn Sie Ihre Vehicule-Klasse geben ein DiscriminatorValue auch. –

Antwort

0

Ich kann die vollständigen Felder Ihrer "Vehicule" -Entität nicht sehen. Aber wenn Sie auf Ihrem Fahrzeug Tisch haben, ein Feldname „vehicule_type“ Sie ust hat es mit dem Namen „vehiculeType“

Gerade im Code angeben, versuchen „vehicule_type“ zu ändern „vehiculeType“

Aber für mehr Hilfe denke ich, dass Sie den Inhalt Ihrer Fahrzeug-Entitätsklasse bereitstellen müssen.

Prost

0

Gibt es einen Bereich mit dem Namen vehicule_type? Ich bezweifle, dass es nicht vorhanden ist und irgendwie versuchen Sie, darauf zuzugreifen, was die Ausnahme verursacht.

0

Sie müssen niemals Kriterien für Diskriminatorwerte eingeben. JPA macht das selbst. Sie müssen nur die richtige Einheit auswählen.

In Ihrem Fall sollten Sie nur auswählen: "SELECT v FROM Car v". Wenn Sie show_sql in Ihrer Konfiguration aktivieren, sehen Sie, dass JPA fügt, wo aliasXX.vehicule_type = 'Auto' automatisch

+0

Es hat einfach funktioniert !!!! ich danke dir sehr !!! – Kiwi

+0

Sie sind willkommen –