在嵌套字段上使用 WHERE 进行 JPQL 查询

2023-11-23

我有一个带有事件列表的 java 实体类 UserBean:

@OneToMany
private List<EventBean> events;

EventBean 有 Date 变量:

@Temporal(javax.persistence.TemporalType.TIMESTAMP)
private Date eventDate;

现在,在 UserBean 中,我想创建一个 NamedQuery,它返回特定范围内的所有日期:

@NamedQuery(name="User.findEventsWithinDates",
            query="SELECT u.events FROM UserBean u WHERE u.name = :name AND u.events.eventDate > :startDate AND u.events.eventDate < :endDate")

但上面的查询无法编译。我收到此错误:

The state field path 'u.events.eventDate' cannot be resolved to a valid type.

顺便说一句,我使用EclipseLink版本2.5.0.v20130507-3faac2b。

我该怎么做才能使这个查询工作?谢谢。


Path u.events.eventDate在 JPQL 中是非法构造,因为不允许通过集合值路径表达式进行导航。在这种情况下u.events是一个集合值路径表达式。在 JPA 2.0 规范中,这是用以下文字来说明的:

从路径组成路径表达式在语法上是非法的 计算结果为集合的表达式。例如,如果 指定Order,路径表达式o.lineItems.product非法 因为导航到 lineItems 会产生一个集合。这个案例 验证查询字符串时应该产生错误。处理 这样的导航,必须在中声明一个标识变量 FROM 子句范围涵盖 lineItems 集合的元素。

这个问题可以通过使用JOIN来解决:

SELECT distinct(u) 
FROM UserBean u JOIN u.events e 
WHERE u.name = :someName
      AND e.eventDate > :startDate 
      AND e.eventDate < :endDate
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在嵌套字段上使用 WHERE 进行 JPQL 查询 的相关文章

随机推荐