2012-09-14 48 views
10

我在兩個實體之間建立了多對多關係:汽車和經銷商。JPQL ManyToMany選擇

在本地的MySQL,我有:

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

而且我想在JPQL使查詢:

#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方法簽名是:

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

我已經試過

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

這裏是我的JPA批註在Java這樣的關係:

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

} 

編輯

我也試過:

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 

參數必須是經銷店實例的集合。

如果你想使用經銷商ID的集合,使用

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

Remamber是JPQL經常使用的實體,映射屬性和關聯。從不表和名稱。

+0

謝謝,請參閱我的編輯。 – gtgaxiola

+0

看來EclipseLink並不想比較對象。它將與Hibernate一起工作。使用我的第二個建議,然後,它比較ID。 –

+0

謝謝...就像一個註釋EclipseLink不喜歡在IN(:dealershipIds)部分中的圓括號... – gtgaxiola