Ich habe die folgende Entitätsklasse (ID geerbt von PersistentObjectSupport-Klasse):
@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. */
}
Wenn ich die folgende Abfrage mit der Criteria-API durchführe:
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();
Im Protokoll wird das folgende SQL ausgegeben:
FINE: SELECT ID, REASON, ENDDATE, UUID, BEGINDATE, VERSION, AMBULANCE_ID FROM AMBULANCEDEACTIVATION WHERE (ENDDATE IS NULL)
Wenn ich jedoch die where()-Zeile im vorherigen Code in diese Zeile ändere:
cq.where(cb.isNull(root.get(model.getSingularAttribute("endDate", Date.class))),
cb.equal(root.get(model.getSingularAttribute("ambulance", Ambulance.class)), ambulance));
Ich erhalte das folgende SQL:
FINE: SELECT ID, REASON, ENDDATE, UUID, BEGINDATE, VERSION, AMBULANCE_ID FROM AMBULANCEDEACTIVATION WHERE (AMBULANCE_ID = ?)
Das heißt, das isNull-Kriterium wird völlig ignoriert. Es ist so, als ob es gar nicht vorhanden wäre (wenn ich der where()-Methode nur das Gleichheitskriterium gebe, bekomme ich die gleiche SQL ausgegeben).
Warum ist das so? Ist es ein Fehler oder übersehe ich etwas?
0 Stimmen
Übrigens habe ich einen Workaround - mit JPQL: em.createQuery("select d from AmbulanceDeactivation d where d.endDate is null and d.ambulance.id = " + ambulance.getId()).getSingleResult();. Ich möchte nur wissen, warum die Criteria API nicht funktioniert.