【发布时间】:2011-03-02 03:43:24
【问题描述】:
我有以下实体类(ID继承自PersistentObjectSupport类):
@Entity
public class AmbulanceDeactivation extends PersistentObjectSupport implements Serializable {
private static final long serialVersionUID = 1L;
@Temporal(TemporalType.DATE) @NotNull
private Date beginDate;
@Temporal(TemporalType.DATE)
private Date endDate;
@Size(max = 250)
private String reason;
@ManyToOne @NotNull
private Ambulance ambulance;
/* Get/set methods, etc. */
}
如果我使用 Criteria API 执行以下查询:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<AmbulanceDeactivation> cq = cb.createQuery(AmbulanceDeactivation.class);
Root<AmbulanceDeactivation> root = cq.from(AmbulanceDeactivation.class);
EntityType<AmbulanceDeactivation> model = root.getModel();
cq.where(cb.isNull(root.get(model.getSingularAttribute("endDate", Date.class))));
return em.createQuery(cq).getResultList();
我在日志中打印了以下 SQL:
FINE: SELECT ID, REASON, ENDDATE, UUID, BEGINDATE, VERSION, AMBULANCE_ID FROM AMBULANCEDEACTIVATION WHERE (ENDDATE IS NULL)
但是,如果我将之前代码中的 where() 行更改为这一行:
cq.where(cb.isNull(root.get(model.getSingularAttribute("endDate", Date.class))),
cb.equal(root.get(model.getSingularAttribute("ambulance", Ambulance.class)), ambulance));
我得到以下 SQL:
FINE: SELECT ID, REASON, ENDDATE, UUID, BEGINDATE, VERSION, AMBULANCE_ID FROM AMBULANCEDEACTIVATION WHERE (AMBULANCE_ID = ?)
也就是说,isNull 标准被完全忽略。就好像它甚至不存在一样(如果我只提供与 where() 方法相同的标准,我会打印相同的 SQL)。
这是为什么呢?是错误还是我遗漏了什么?
【问题讨论】:
-
顺便说一句,我有一个解决方法 - 使用 JPQL: em.createQuery("select d from AmbulanceDeactivation d where d.endDate is null and d.ambulance.id = " + ambulance.getId() ).getSingleResult();。我只想知道为什么 Criteria API 不起作用。
标签: java jpa criteria-api jpa-2.0