2016-08-07 8 views
-2

私はPersonクラスとCarクラスを持っています。JPAサブクエリの基準

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")は、すべての車を持つ人物を返します。

しかし、まだ販売されていない車を使ってid 1のPersonを取得したいと考えています。

どうすれば実現できますか?

+0

人テーブルと車のテーブルの間でusesql joinする必要があります –

+0

JPAはよく知っていますが、SQLの観点からはsimlpyです。暗黙のINNER JOINを使用してください: 'P from Person P、Car C WHERE P.id = 1 AND C.isSold = false' – JayC667

+0

あなたは「私が所有しているすべての車をid 1の車が売られていない場所に持って行きたい」という意味です。 id 1を持つPersonには、販売されていない車が入っている "cars"フィールドだけを取得することはできません(ID 1のPersonにはsol carがあるので、同様に含まれます)。あなたが試したことを投稿してください –

答えて

0

あなたは二つの方法を得ることができます。今、あなたはPersonオブジェクトになり帰することができます

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ゲッターとセッター

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

1.Create別のSQLクエリ。

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

まず、エンティティを正しくマップする必要があります。私はあなたがそれをDITと思いますが、あなたはまだそれを行っていない場合は、以下のマッピングは、目的を果たすかもしれません:

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

クエリ:このクエリはid = 1で人を返します

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 

と人が所有し、売られていないすべての車。

関連する問題