JPA子查询标准

时间:2016-08-07 08:46:13

标签: java hibernate jpa

我有一个Person类和一个Car类。

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

class Car{
    long id;
    Person owner;
    boolean isSold;
}

em.createQuery("SELECT P FROM Person P WHERE P.id = 1")将返回一个拥有所有车辆的人。

但是,我想找一个身份1的人,他们的车尚未售出。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

你可以通过两种方式获得:

1.创建另一个SQL查询:

<data_type>

2.创建getter和setter

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;

现在您可以将结果归于Person对象。

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;
  }
}

答案 1 :(得分:0)

首先,您必须正确映射实体。我想你是这样做的,但是如果你还没有这样做,下面的映射可能会达到目的:

@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
}

查询:

  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

此查询将返回具有id = 1的人以及该人拥有并且未售出的所有车辆。