我想使用不存在使用标准api。检查是当所有汽车不存在于和当前时返回所有租赁。问题是即使我删除了subQueryPredicates也没有效果,租赁表中使用Car字段的表之间的连接不起作用。请帮帮我。JPA CriteriaApi:不存在与实体之间的关系
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Car> query = cb.createQuery(Car.class);
Root<Car> tbCar = query.from(Car.class);
query.select(tbCar);
Subquery<Rental> subquery = query.subquery(Rental.class);
Root<Rental> tbRental = subquery.from(Rental.class);
subquery.select(tbRental);
List<Predicate> subQueryPredicates = new ArrayList<Predicate>();
subQueryPredicates.add(cb.equal(tbRental.get("car"), tbCar));
subQueryPredicates.add(cb.greaterThan(tbRental.<LocalDate>get("from"), counterDate));
subQueryPredicates.add(cb.lessThan(tbRental.<LocalDate>get("to"), counterDate));
subQueryPredicates.add(cb.equal(tbRental.get("status"), "booked"));
subquery.where(subQueryPredicates.toArray(new Predicate[]{}));
List<Predicate> mainQueryPredicates = new ArrayList<Predicate>();
mainQueryPredicates.add(cb.not(cb.exists(subquery)));
这是我的出租单位。租赁和汽车之间的连接是“汽车”领域。
@Entity
public class Rental {
public static final String STATUS_BOOKED = "booked";
public static final String STATUS_CANCELED = "canceled";
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@NotBlank
private String status;
@NotNull
@ManyToOne
private Car car;
@NotNull
@ManyToOne
private Client client;
@NotNull
@Column(name="\"from\"")
private LocalDate from;
@NotNull
@Column(name="\"to\"")
private LocalDate to;
这是我的车实体
@Entity
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@ManyToOne
private Provider provider;
@NotBlank
@Column(unique = true)
private String licensePlate;
这是HQL我会模仿:
String sql = "from Car c where not exists ("
+ "from Rental r"
+ "where "
+ "r.car = c "
+ "and "
+ counterDate.toString()
+ "between r.from and r.to "
+ "and r.status ='booked')";
你的问题是什么? – Masudul
嗨,我更新了说明.. – richersoon