Java JPA子查询条件

Java JPA子查询条件,java,hibernate,jpa,Java,Hibernate,Jpa,我有个人课和汽车课 class Person { long id; Set<Car> cars; } class Car{ long id; Person owner; boolean isSold; } 班级人员{ 长id; 设置车辆; } 班车{ 长id; 个人所有者; 布尔isSold; } em.createQuery(“从Person p中选择p,其中p.id=1”)将返回一个人及其所有汽车 然而,我想找一个身份证为1的人,他们

我有个人课和汽车课

class Person {
    long id;
    Set<Car> cars;
}

class Car{
    long id;
    Person owner;
    boolean isSold;
}
班级人员{
长id;
设置车辆;
}
班车{
长id;
个人所有者;
布尔isSold;
}
em.createQuery(“从Person p中选择p,其中p.id=1”)
将返回一个人及其所有汽车

然而,我想找一个身份证为1的人,他们的车还没有售出


我如何才能做到这一点?

您可以通过两种方式实现:

1.创建另一个sql查询:

SELECT c.id, c.idOwner, c.isSold FROM Person p join Car c on p.id = c.carId where c.isSold = false and p.id = 1;
2.创建getter和setter

class Person {
  long id;
  Set<Car> cars;

  public long getId() {
      return id;
  }

  public void setId(long id) {
      this.id = id;
  }

  public Set<Car> getCars() {
      return cars;
  }

  public void setCars(Set<Car> cars) {
      this.cars = cars;
  }
}
班级人员{
长id;
设置车辆;
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
公共设置getCars(){
返回车辆;
}
公共车辆(固定车辆){
这个。汽车=汽车;
}
}
现在您可以将结果归因于Person对象

Query q = em.createQuery("SELECT P FROM Person P WHERE P.id = 1");
Person person = q.getSingleResult();
Set<Car> cars = person.getCars();
ArrayList<Car> unsoldCars = new ArrayList<Car>();
cars.foreach(car -> { 
 if(car.isSold == false) {
    unsoldCars.add(car);
  } 
 });
Query q=em.createQuery(“从Person P中选择P,其中P.id=1”);
Person=q.getSingleResult();
Set cars=person.getCars();
ArrayList unladcars=新的ArrayList();
汽车.foreach(汽车->{
if(car.isSold==假){
未售出汽车。添加(汽车);
} 
});

首先,您必须正确映射实体。我想您可以编辑它,但如果您还没有这样做,以下映射可能会起到作用:

@Entity
class Person {
    @Id @GeneratedValue private long id;

    @OneToMany(mappedBy = "owner")
    Set<Car> cars;

    // getters and setters
}

@Entity
class Car{
    @Id @GeneratedValue private long id;

    @ManyToOne
    @JoinColumn( name = "owner_id")
    Person owner;

    boolean isSold;

    // Getters and Setters
}
@实体
班主任{
@Id@GeneratedValue private long Id;
@OneToMany(mappedBy=“所有者”)
设置车辆;
//接球手和接球手
}
@实体
班车{
@Id@GeneratedValue private long Id;
@许多酮
@JoinColumn(name=“owner\u id”)
个人所有者;
布尔isSold;
//接球手和接球手
}
查询:

  String queryString = "SELECT p FROM Person p join p.cars c where c.isSold = false and p.id = 1";
  TypedQuery<Person> q = em.createQuery(queryString, Person.class);
  Person p = q.getSingleResult();
  Set<Car> unsoldCars = p.getCars();
  // Don't forget exception handling
String queryString=“从人员p选择p加入p.cars c,其中c.isSold=false,p.id=1”;
TypedQuery q=em.createQuery(queryString,Person.class);
Person p=q.getSingleResult();
设置unsoldCars=p.getCars();
//不要忘记异常处理

此查询将返回id为1的人员以及该人员拥有且未售出的所有汽车

您需要在person表和car表之间使用SQL连接我不太了解JPA,但从SQL的角度来看,使用隐式内部连接:
从person p中选择p,car C,其中p.id=1和C.isSold=false
您的意思是“我想让id为1的person拥有所有未出售的汽车”。您无法使用id为1的人员的“cars”字段仅包含未售出的汽车(因为如果id为1的人员拥有sol汽车,那么他们也将被包括在内)。张贴你尝试过的内容