2016-08-07 9 views
-2

Ich habe eine Personenklasse und eine Autoklasse.JPA Unterabfragekriterien

class Person { 
    long id; 
    Set<Car> cars; 
} 

class Car{ 
    long id; 
    Person owner; 
    boolean isSold; 
} 

em.createQuery("SELECT P FROM Person P WHERE P.id = 1") wird eine Person mit all seinen Autos zurückgeben.

Allerdings möchte ich eine Person mit der ID 1, mit ihren Autos, die noch nicht verkauft ist.

Wie kann ich das erreichen?

+0

müssen Sie usesql Join zwischen Person Tabelle und Auto Tabelle –

+0

Ich weiß nicht JPA gut, aber Simlpy gehen aus der Sicht von SQL: Verwenden Sie die implizite INNER JOIN: 'SELECT P FROM Person P, Car C WHERE P.id = 1 UND C.isSold = false' – JayC667

+0

Sie meinen "Ich möchte alle Autos von Person mit ID 1, wo das Auto nicht verkauft wird" erhalten. Sie können keine Person mit der ID 1 mit ihrem Feld "Autos" bekommen, das nur nicht verkaufte Autos enthält (denn wenn eine Person mit der ID 1 Sol Autos hat, dann werden sie ebenfalls mit einbezogen). Posten Sie, was Sie versucht haben –

Antwort

0

Sie können es zwei Möglichkeiten erhalten:

1.Erstellen eine andere SQL-Abfrage:

SELECT c.id, c.idOwner, c.isSold FROM Person p join Car c on p.id = c.carId where c.isSold = false and p.id = 1; 

2.Create Getter und Setter

class Person { 
    long id; 
    Set<Car> cars; 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public Set<Car> getCars() { 
     return cars; 
    } 

    public void setCars(Set<Car> cars) { 
     this.cars = cars; 
    } 
} 

Jetzt können Sie zu Objekt Person zuschreiben führen .

Query q = em.createQuery("SELECT P FROM Person P WHERE P.id = 1"); 
Person person = q.getSingleResult(); 
Set<Car> cars = person.getCars(); 
ArrayList<Car> unsoldCars = new ArrayList<Car>(); 
cars.foreach(car -> { 
if(car.isSold == false) { 
    unsoldCars.add(car); 
    } 
}); 
0

Zuerst müssen Sie die Entitäten korrekt zuordnen. Ich denke, man es dit, aber wenn Sie es noch nicht getan haben, wird die folgende Abbildung könnte dem Zweck dienen:

@Entity 
class Person { 
    @Id @GeneratedValue private long id; 

    @OneToMany(mappedBy = "owner") 
    Set<Car> cars; 

    // getters and setters 
} 

@Entity 
class Car{ 
    @Id @GeneratedValue private long id; 

    @ManyToOne 
    @JoinColumn(name = "owner_id") 
    Person owner; 

    boolean isSold; 

    // Getters and Setters 
} 

Abfrage:

String queryString = "SELECT p FROM Person p join p.cars c where c.isSold = false and p.id = 1"; 
    TypedQuery<Person> q = em.createQuery(queryString, Person.class); 
    Person p = q.getSingleResult(); 
    Set<Car> unsoldCars = p.getCars(); 
    // Don't forget exception handling 

Diese Abfrage die Person mit dem id = 1 zurückkehren und alle Autos der Person, die nicht verkauft werden.