with sentencias relaciones query namedquery example ejemplos create jpa eclipselink jpql named-query

jpa - sentencias - jpql order by



Consulta JPQL con WHERE en campos anidados (1)

Tengo una clase de entidad java UserBean con una lista de eventos:

@OneToMany private List<EventBean> events;

EventBean tiene una variable de fecha:

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

Ahora, en UserBean, quiero crear una NamedQuery que devuelva todas las fechas que caen dentro de un rango específico:

@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")

La consulta anterior no compila sin embargo. Me sale este error:

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

Por cierto, uso EclipseLink versión 2.5.0.v20130507-3faac2b.

¿Qué puedo hacer para que esta consulta funcione? Gracias.


Path u.events.eventDate es una construcción ilegal en JPQL, porque no está permitido navegar a través de una expresión de ruta valorada de colección. En este caso u.events es una expresión de ruta valorada de colección. En la especificación JPA 2.0 esto se cuenta con las siguientes palabras:

Es sintácticamente ilegal componer una expresión de ruta a partir de una expresión de ruta que se evalúa como una colección. Por ejemplo, si o designa Order, la expresión de ruta o.lineItems.product es ilegal ya que la navegación a lineItems da como resultado una colección. Este caso debe producir un error cuando se verifica la cadena de consulta. Para manejar dicha navegación, se debe declarar una variable de identificación en la cláusula FROM para que abarque los elementos de la colección lineItems.

Este problema se puede resolver usando JOIN:

SELECT distinct(u) FROM UserBean u JOIN u.events e WHERE u.name = :someName AND e.eventDate > :startDate AND e.eventDate < :endDate