当前位置: 首页 > 面试题库 >

JPQL ManyToMany选择

康弘义
2023-03-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]]

问题答案:
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始终使用实体,映射的属性和关联。永远不要表和列名。



 类似资料:
  • 我希望,如果我选择“mammals”,动物选择选项只显示值为1的选项data-animal_class。 我知道如何获得哺乳动物值,但我不知道如何使用过滤器 这是我的代码:

  • 问题内容: 我想设置一个先前选择的要在页面加载时显示的选项。我用以下代码尝试了它: 与 但这是行不通的。有任何想法吗? 问题答案: 这绝对应该工作。确保已将代码放入:

  • 我想调用一个函数时,选择的任何选项。类似于这样: 但不知何故不起作用。有人能帮忙吗。 请注意 我不想捕获更改事件,如果我选择已经选择选项,则不会触发更改事件

  • 问题内容: 如果我只需要2/3列,而是查询而不是在select查询中提供这些列,那么关于更多/更少I / O或内存的性能是否会有所下降? 如果我确实选择了*,则可能会出现网络开销。 但是在选择操作中,数据库引擎是否总是从磁盘中提取原子元组,还是仅提取在选择操作中请求的那些列? 如果它总是拉一个元组,则I / O开销是相同的。 同时,如果它拉出一个元组,从元组中剥离请求的列可能会占用内存。 因此,在

  • 问题内容: 在Python,Java和其他几种硒绑定中,在HTML结构(class)上有一个非常方便的抽象。 例如,假设有以下标记: 这是我们如何在Python中操作它的方法: 换句话说,这是一个 非常透明且易于使用的抽象 。 可以类似的方式 在量角器* 中操纵标签吗? * 这与下拉式量角器e2e测试中的“如何选择选项”或量角器测试中的“选择”框中的如何单击选项不是重复的?。 问题答案: 在量角器

  • 在Python、Java和其他几个selenium绑定中,对

  • 下列选项是根据在第一步选择的文件格式而有所不同。 包含列的标题 如果勾选了这个选项,字段名将会包含在导出的文件。 如果零,留空白 如果字段内容是 0,留空白。 追加 将记录追加至现有的文件。 遇到错误时继续 在导出进程中忽略遇到的错误。 在 XML 中使用属性格式 属性格式 <RECORDS> <RECORD OrderNo="1003" ItemNo="1" PartNo="1313" Qty=

  • 下列选项是根据在第一步选择的文件格式而有所不同。 包含列的标题 如果勾选了这个选项,字段名将会包含在导出的文件。 如果零,留空白 如果字段内容是 0,留空白。 追加到输出文件 将记录追加至现有的文件。 遇到错误时继续 在导出进程中忽略遇到的错误。 记录分隔符、字段分隔符、文本标识符号 指定记录的分隔符号、字段的分隔符号和用于括住文本值的字符。 日期排序、日期分隔符 指定日期的格式和日期的分隔符。