Java JPA CriteriaApi:不存在实体作为关系
我想使用不存在使用标准api。检查的内容是,如果从开始到目前为止没有车,则退还所有租金。问题是,即使我删除子QueryPredicates,也没有任何效果,Rental表中使用Car字段的表之间的连接不起作用。请帮帮我Java JPA CriteriaApi:不存在实体作为关系,java,sql,hibernate,jpa,Java,Sql,Hibernate,Jpa,我想使用不存在使用标准api。检查的内容是,如果从开始到目前为止没有车,则退还所有租金。问题是,即使我删除子QueryPredicates,也没有任何效果,Rental表中使用Car字段的表之间的连接不起作用。请帮帮我 CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Car> query = cb.createQuery(Car.class); Root<Car> tbCar = query.
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 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' )";
看看JPA2.0中的子查询。在我看来,您缺少将主查询映射到子查询的路径?我猜您的条件末尾缺少
where
子句:
。。。
List mainQueryPredicates=new ArrayList();
mainQueryPredicates.add(cb.not(cb.exists(子查询));
where(mainQueryPredicates.toArray(新谓词[]{}));
因此不考虑子查询。您的问题是什么?您好,我更新了描述。。
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' )";
...
List<Predicate> mainQueryPredicates = new ArrayList<Predicate>();
mainQueryPredicates.add(cb.not(cb.exists(subquery)));
query.where(mainQueryPredicates.toArray(new Predicate[]{}));