gpt4 book ai didi

java - JPA 2 标准 API : why is isNull being ignored when in conjunction with equal?

转载 作者:行者123 更新时间:2023-12-04 06:51:48 27 4
gpt4 key购买 nike

我有以下实体类(从 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)。

这是为什么?这是一个错误还是我错过了什么?

最佳答案

我使用 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 提供程序的错误。

关于java - JPA 2 标准 API : why is isNull being ignored when in conjunction with equal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3014313/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com