0

我一直在编写代码来构建条件查询以进行条件连接。但它并不正确。请考虑以下示例:

我有 2 个实体OwnerCar. Owner与有OneToMany关系Car

在此处输入图像描述

代码Owner实体有Lists Car。(@OneToMany与 一起使用FetchType.LAZY

所有者.java:

@Entity
public class Owner {

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    private int id;
    private String name;
    private String email;

    @OneToMany(mappedBy="owner",fetch=FetchType.LAZY)
    private List<Car>  cars;

    ...
}

汽车.java

@Entity
public class Car{

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private int id;
    private String manufacturer;
    private String regnumber;

    @ManyToOne
    @JoinColumn(name="ownerid")
    private Owner owner;
    ...
} 

现在我的要求很简单,我想获得所有 TESLA 汽车的车主。以下代码适用于此:

CriteriaQuery<Owner> cq = cb.createQuery(Owner.class);
Root<Owner> rootowner = cq.from(Owner.class);
rootowner.fetch("cars");

cq.distinct(true);

Join<Owner, Car> carjoin= rootowner.join(Owner_.cars);
Expression<String> carmanExp = carjoin.get(Car_.manufacturer);
Predicate p = cb.like(carmanExp, "TESLA");
cq.where(p);

TypedQuery<Owner> tq = em.createQuery(cq);

现在我的要求是,如果一个Owner人拥有两辆汽车,一辆是特斯拉,另一辆是沃尔沃。我希望Owner实体应该只包含TESLA.

我怎么做?

4

1 回答 1

0

您不能在简单的 JPA 查询中即时执行您所要求的操作,因为这是对 JPA 实体的操作,它不再代表数据库中的内容。换句话说,当 JPA 将仅引用特斯拉的所有者返回给您时,您希望它与现在已删除的沃尔沃在与数据库同步时做什么?

在您的情况下,最简单的解决方案是只查询您想要的汽车,因为它们有对其所有者的引用。如果车主可能有两个或更多特斯拉,您将得到重复 - 您可以通过自己创建车主到汽车的地图来解决这个问题。

于 2017-11-01T14:56:18.720 回答