【问题标题】:Using JPA Criteria Query API for Many-to-Many Example使用 JPA Criteria Query API 进行多对多示例
【发布时间】:2014-05-29 03:22:12
【问题描述】:

如果我有两个具有多对多关系的类——卡车和设备——我希望能够编写一个 JPA CriteriaQuery 来查找与某个设备 ID 匹配的所有卡车。为简单起见,这两个类如下。卡车有一个设备清单,但设备不知道卡车:

public class Truck {
  private Long id;

  @ManyToMany(cascade=CascadeType.ALL)
  @JoinTable(
    name="truck_equipment",
    joinColumns={ @JoinColumn(name="truck_id") },
    inverseJoinColumns={ @JoinColumn(name="equip_id") }
  )
  private List<Equipment> equipment;
}

public class Equipment {
  private Long id;
  private String equipCode;
}

我知道我可以编写一个查询来获取特定卡车的所有设备,但我想要相反:所有具有特定设备的卡车,但我无法获得我正在寻找的东西。这是为我提供某辆卡车的所有设备的反向查询:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Equipment> cq = cb.createQuery(Equipment.class);
Root<Truck> truckRoot = cq.from(Truck.class);
cq.where(cb.equal(truckRoot.get(Truck_.id), truckId));
ListJoin<Truck, Equipment> trucks = truckRoot.join(Truck_.equipment);
CriteriaQuery<Equipment> cq_e = cq.select(trucks);
TypedQuery<Equipment> query = entityManager.createQuery(cq_e);
query.getResultList();

有人可以帮我得到这个查询的逆吗?

【问题讨论】:

  • 为此,您需要关联集的双方。因此 Equipment 也会引用卡车,您可以在查询时使用。这也是决定这是多对多还是一对多关联的好时机。
  • 是的,只要双方有参考,就很简单。由于在 JSON 中写出对象时出现问题——无限递归问题,我们从一侧删除了引用。

标签: java sql hibernate jpa criteria-api


【解决方案1】:

我们最终做了以下事情。我不确定它是否像其他方式一样有效,但它仍然允许我们保留对我们很重要的元模型类,并将对象引用保留在一侧以避免将这些对象写入 JSON 时出现问题(无限递归):

private getEquipmentPredicate(CriteriaBuilder cb, Root<Truck> root) {
    EquipmentType type = findEquipmentType("not related to this answer");
    Expression<List<EquipmentType>> equipments = root.get(Truck_.equipmentTypes);
    Predicate p = cb.isMember(type, equipments);
    return p;
}

【讨论】:

    【解决方案2】:

    我做到了:

    String someCode = "xxx";
    CriteriaBuilder builder = ...
    builder.and(
            root.join(Truck_.equipmentTypes).get(Equipment_.equipCode)
                            .in(Collections.singleton(someCode)
    );
    

    【讨论】:

      猜你喜欢
      • 2021-01-20
      • 2018-08-27
      • 2012-09-07
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      • 2018-01-23
      • 2022-12-21
      • 2011-07-17
      相关资源
      最近更新 更多