2012-09-14 3 views
10

Tôi có mối quan hệ Nhiều đến Nhiều giữa hai thực thể được gọi là: Ô tô và Đại lý.JPQL ManyToMany chọn

Trong MySQL mẹ đẻ tôi có:

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

Và truy vấn Tôi muốn làm trong JPQL là:

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

cách thích hợp để làm cho JPQL tương đương là gì?

My Java phương pháp chữ ký là:

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

Tôi đã thử

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

Đây là JPA Chú thích của tôi cho mối quan hệ như vậy trong 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) 

} 

EDIT

Tôi cũng đã cố gắng:

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

nào ném Lỗi:

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]] 

Trả lời

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

Tham số phải là một tập hợp các trường hợp Đại lý.

Nếu bạn muốn sử dụng một tập hợp các ID đại lý, sử dụng

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

Remamber rằng JPQL luôn luôn sử dụng các thực thể, ánh xạ các thuộc tính và các hiệp hội. Không bao giờ tên bảng và cột.

+0

cảm ơn, vui lòng xem chỉnh sửa của tôi. – gtgaxiola

+0

Có vẻ như EclipseLink không muốn so sánh các đối tượng. Nó sẽ làm việc với Hibernate. Sử dụng gợi ý thứ hai của tôi, sau đó, so sánh ID. –

+0

Cảm ơn ... cũng giống như một lưu ý EclipseLink không thích dấu ngoặc đơn trong phần IN (: dealershipIds) ... – gtgaxiola