2012-09-14 13 views
10

Tengo una relación Muchos a muchos entre dos entidades llamadas: Automóvil y concesionario.JPQL ManyToMany seleccione

En MySQL nativa que tengo:

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

Y la consulta Quiero hacer en JPQL es:

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

¿Cuál es la forma correcta de hacer el equivalente JPQL?

Mi Java firma del método es:

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

He tratado

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

Aquí está mi anotaciones JPA para tal relación en 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) 

} 

EDITAR

también he intentado:

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

cual arrojó el error:

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

Respuesta

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

el parámetro debe ser una colección de instancias de representación.

Si desea utilizar un conjunto de identificadores de concesionario, utilice

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

Remamber que JPQL utilice siempre entidades, asigna atributos y asociaciones. Nunca nombres de tablas y columnas.

+0

gracias, por favor vea mi edición. – gtgaxiola

+0

Parece que EclipseLink no quiere comparar objetos. Funcionaría con Hibernate. Use mi segunda sugerencia, entonces, que compara ID. –

+0

Gracias ... solo como una nota a EclipseLink no le gustan los paréntesis en la parte IN (: dealershipIds) ... – gtgaxiola