2012-09-14 17 views
10

私は、CarとDealershipという2つのエンティティ間に多対多の関係があります。JPQL ManyToMany select

car (id and other values) 
dealership (id and other values) 
car_dealership (car_id and dealership_id) 

をそして、私はJPQLにしたいクエリは次のとおりです:ネイティブのMySQLで

私が持っている

#Select List of cars in multiple dealerships 
SELECT car_id FROM car_dealership WHERE dealership_id IN(1,2,3,56,78,999); 

JPQL相当を作るための適切な方法は何ですか?

私のJavaメソッドのシグネチャは次のとおりです。私はここで

//TOTALLY WRONG QUERY CALL!!!  
    Query query = em.createQuery("SELECT c FROM Car c WHERE :dealer_ids IN c.dealerships"); 
    List<Long> dealerIds = new ArrayList<Long>(); 
    for(Dealership d : dealerships) { 
     dealerIds.add(d.getId()); 
    } 
    query.setParameter(":dealer_ids", dealerIds); 
    List<Dealership> result = (List<Dealership>) query.getResultList(); 
    return result; 
} 

を試してみました

public List<Car> findByDealership(List<Dealership> dealerships); 

はJavaで、そのような関係のための私のJPA注釈です:

@Entity 
@Table(name = "car") 
public class Car implements Serializable { 

    //Setup of values and whatnot.... 
    @ManyToMany 
    @JoinTable(name = "car_dealership", joinColumns = 
    @JoinColumn(name = "car_id", referencedColumnName = "id"), 
    inverseJoinColumns = @JoinColumn(name = "dealership_id", referencedColumnName = "id")) 
    private List<Dealership> dealerships; 

    ... other stuff (getters/setters) 

} 

@Entity 
@Table(name = "property") 
public class Dealership implements Serializable { 

    //Setting of values and whatnot 

    @ManyToMany(mappedBy = "dealerships") 
    private List<Car> cars; 

    .... other stuff(getters/setters) 

} 

EDIT

は、私も試してみました:エラーを投げた

Query query = em.createQuery("SELECT c FROM Car c INNER JOIN c.dealerships d WHERE d IN (:deals)"); 
query.setParameter("deals", dealerships); 

は:

org.eclipse.persistence.exceptions.QueryException 

Exception Description: Object comparisons can only use the equal() or notEqual() operators. 
Other comparisons must be done through query keys or direct attribute level comparisons. 

Expression: [ 
Relation operator [ IN ] 
Query Key dealerships 
    Base stackoverflow.question.Car 
Constant [ 
Parameter deals]] 

答えて

25
select car from Car car 
inner join car.dealerships dealership 
where dealership in :dealerships 

パラメータは、ディーラーのインスタンスのコレクションでなければなりません。

あなたはJPQLは常にエンティティを使用することを

select car from Car car 
inner join car.dealerships dealership 
where dealership.id in :dealershipIds 

Remamberを使用し、販売代理店IDのコレクションを使用する場合は、属性と関連をマッピングされました。テーブル名とカラム名は使用しないでください。

+0

ありがとう、私の編集をご覧ください。 – gtgaxiola

+0

EclipseLinkはオブジェクトを比較したくないようです。これはHibernateで動作します。 IDを比較する私の2番目の提案を使用してください。 –

+0

ありがとう...ちょうどメモとして、EclipseLinkはIN(:dealershipIds)の部分のカッコが好きではありません。 – gtgaxiola