我有以下实体类(继承自PersistentObjectSupport类的ID):
@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打印)。
为什么?这是一个错误还是我错过了什么?
答案 0 :(得分:2)
我使用EclipseLink测试了您的代码和条件查询(您使用的是EclipseLink,对吗?)并且我重现了行为:isNull
部分被忽略。
但是,使用Hibernate Entity Manager 3.5.1,会生成以下查询:
select ambulanced0_.id as id7_, ambulanced0_.ambulance_id as ambulance5_7_, ambulanced0_.beginDate as beginDate7_, ambulanced0_.endDate as endDate7_, ambulanced0_.reason as reason7_
from AmbulanceDeactivation ambulanced0_
where (ambulanced0_.endDate is null) and ambulanced0_.ambulance_id=?
预期结果如何。所以我想我们可以假设这是你的JPA 2.0提供程序的错误。
答案 1 :(得分:1)
使用嵌入了EclipseLink 2.0的Glassfish 3.0.1,我有同样的奇怪行为。
我试图用Glassfish 3.1.2包含Eclipselink 2.3库来仔细更改嵌入式eclipselink库。它解决了这个问题。因此,绝对可以肯定isNull检查是否同等条件是使用criteriaBuilder的eclipselink错误。
我将很快升级我们的GlassFish环境以消除问题。