java - 使用 JPA Criteria 查询 API 进行多对多示例

标签 java sql hibernate jpa criteria-api

如果我有两个具有多对多关系的类(卡车和设备),我希望能够编写 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();

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

最佳答案

我们最终做了以下事情。我不确定它是否与其他方式一样有效,但它仍然允许我们保留对我们很重要的元模型类,并将对象引用保留在一侧,以避免将这些对象写入 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;
}

关于java - 使用 JPA Criteria 查询 API 进行多对多示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23925186/

相关文章:

java - 如何使用java api在neo4j中创建具有多个节点的节点

sql - DB2 rownum 等价物

java - 定义与数据库无关的 JPA 对象 uid

java - 这是 @OneToOne 关系中 "mappedBy"的正确使用吗?

java - 在 hibernate 中检索子属性时出错

运行多个线程时java线程不会中断

java.lang.ClassNotFoundException : sun. misc.Cleaner

mysql - 从两个表中查找第三个表中不存在的组合

Java 小程序问题 : dll already loaded in another classloader

sql - 使用 avg 绘制查询树?