2012-09-14 17 views
10

Ho una relazione Molti a Molti tra due entità chiamate: Car and Dealership.JPQL ManyToMany select

In nativo di MySQL che ho:

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

e la query voglio fare in JPQL è:

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

Qual è il modo corretto di fare l'equivalente JPQL?

metodo

mio Java firma è:

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

ho cercato

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

Ecco il mio JPA annotazioni per tale rapporto in 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

012.

Ho anche provato:

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

che ha gettato l'errore:

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

risposta

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

Il parametro deve essere un insieme di istanze concessionaria.

Se si desidera utilizzare una collezione di ID di concessionaria, utilizzare

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

Remamber che JPQL utilizzare sempre le entità, mappati gli attributi e le associazioni. Mai nomi di tabelle e colonne.

+0

grazie, vedere la mia modifica. – gtgaxiola

+0

Sembra che EclipseLink non voglia confrontare gli oggetti. Funzionerebbe con Hibernate. Usa il mio secondo suggerimento, quindi, che confronta gli ID. –

+0

Grazie ... proprio come una nota a EclipseLink non piacciono le parentesi nella parte IN (: dealershipIds) ... – gtgaxiola