JPQL查询语言中的ManyToMany选择

14

我有两个实体之间的多对多关系,它们分别是:汽车和经销商。

在本机 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;
}

这是我在Java中使用JPA注解表示此关系的方式:

@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]]
1个回答

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

参数必须是经销商实例的集合。

如果您想使用经销商IDs的集合,请使用

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

请记住,JPQL 总是使用实体、映射属性和关联。而不会使用表和列名。


看起来EclipseLink不想比较对象。它会与Hibernate一起工作。那么请使用我的第二个建议,比较ID。 - JB Nizet
谢谢... 只是提醒一下,EclipseLink 不喜欢 IN (:dealershipIds) 部分中的括号... - gtgaxiola
@GilbertoGaxiola:由于一个已经修复的Hibernate bug,我养成了使用括号的坏习惯。问题已解决。 - JB Nizet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接