Java JPA CriteriaApi:不存在实体作为关系

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.

我想使用不存在使用标准api。检查的内容是,如果从开始到目前为止没有车,则退还所有租金。问题是,即使我删除子QueryPredicates,也没有任何效果,Rental表中使用Car字段的表之间的连接不起作用。请帮帮我

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[]{}));