我有一个带有事件列表的java实体类UserBean:
@OneToMany
private List<EventBean> events;
EventBean具有日期变量:
@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。
如何使此查询有效?感谢。
答案 0 :(得分:14)
路径u.events.eventDate
是JPQL中的非法构造,因为不允许通过集合值路径表达式进行导航。在这种情况下,u.events
是一个集合值路径表达式。在JPA 2.0规范中,用以下词语告知:
从路径组成路径表达式在语法上是非法的 表达式,用于计算集合。例如,如果o 指定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