2012-09-14 24 views
10

मेरे पास दो इकाइयों के बीच कई संबंध हैं: कार और डीलरशिप।जेपीक्यूएल मल्टी टॉनी चुनिंदा

देशी 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 बराबर बनाने के लिए उचित तरीका क्या है?

मेरे जावा विधि हस्ताक्षर है:

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

यहाँ की कोशिश की है जावा में इस तरह के रिश्ते के लिए मेरी जेपीए एनोटेशन है:

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

} 

संपादित

012,

मैं भी कोशिश की है:

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 

पैरामीटर डीलरशिप उदाहरणों का एक संग्रह होना चाहिए।

आप डीलरशिप आईडी की एक संग्रह का उपयोग करना चाहते हैं, तो

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

Remamber का उपयोग करें कि JPQL हमेशा की तरह, संस्थाओं का उपयोग विशेषताओं और संघों मैप किया। टेबल और कॉलम नाम कभी नहीं।

+0

धन्यवाद, कृपया मेरा संपादन देखें। – gtgaxiola

+0

ऐसा लगता है कि ग्रहण लिंक वस्तुओं की तुलना नहीं करना चाहता है। यह हाइबरनेट के साथ काम करेगा। मेरे दूसरे सुझाव का प्रयोग करें, फिर, जो आईडी की तुलना करता है। –

+0

धन्यवाद ... बस एक नोट के रूप में EclipseLink को IN (: डीलरशिप आईडी) भाग में कोष्ठक पसंद नहीं है ... – gtgaxiola