gpt4 book ai didi

java - JPQL 多对多选择

转载 作者:搜寻专家 更新时间:2023-10-30 21:17:23 26 4
gpt4 key购买 nike

我在两个实体之间建立了多对多关系:汽车和经销商。

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

最佳答案

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

参数必须是 Dealership 实例的集合。

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

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

请记住,JPQL 始终使用实体、映射属性和关联。永远不要表名和列名。

关于java - JPQL 多对多选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12425835/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com