10

我有一个带有事件列表的 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。

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

4

1 回答 1

22

Pathu.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
于 2013-09-09T20:04:59.730 回答