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

use*_*453 8 jpa named-query eclipselink jpql

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

@OneToMany
private List<EventBean> events;
Run Code Online (Sandbox Code Playgroud)

EventBean有Date变量:

@Temporal(javax.persistence.TemporalType.TIMESTAMP)
private Date eventDate;
Run Code Online (Sandbox Code Playgroud)

现在在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")
Run Code Online (Sandbox Code Playgroud)

上面的查询不能编译.我收到此错误:

The state field path 'u.events.eventDate' cannot be resolved to a valid type.
Run Code Online (Sandbox Code Playgroud)

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

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

Mik*_*unu 16

Path 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
Run Code Online (Sandbox Code Playgroud)