2014-06-07 66 views
0

我想使用不存在使用标准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')"; 
+0

你的问题是什么? – Masudul

+0

嗨,我更新了说明.. – richersoon

回答

0

在这个Question看看于子在JPA 2.0。在我看来,你错过了将主查询映射到子查询的路径?

0

我想这where条款是在条件的末尾丢失:

... 

List<Predicate> mainQueryPredicates = new ArrayList<Predicate>(); 
mainQueryPredicates.add(cb.not(cb.exists(subquery))); 
query.where(mainQueryPredicates.toArray(new Predicate[]{})); 

因此子查询不考虑。