SCBCD del día: EJB QL

(Imagen: Henri Matisse - Las penas del rey)

A User entity is in a one-to-many relationship with a Book entity. Assume that a developer has a function fetchBook(String title) that fetches a Book entity with the given title. Also assume that the developer has an entity manager em. Which query can be used to return the user that holds the book titled "Java"

  • em.createQuery("SELECT u from User where :great IN u.books.title").setParameter("great", "Java")
  • em.createQuery("Select u from User u where :great IN u.books").setParameter("great", fetchBook("Java"))
  • em.createQuery("SELECT u From User u where :great MEMBER OF u.books.title").setParameter("great", "Java")
  • em.createQuery("Select u from User u where :great MEMEBER OF u.books").setParameter("great", fetchBook("Java"))

Un poco de EJB QL, para no olvidarlo en el examen. Muchas relaciones entre beans entidad se basan en colecciones, como la de la pregunta, y acceder a los beans de estas relaciones es importante. Ahora, es ilegal seleccionar elementos directamente de una relación basada en colecciones. Para evitarnos este problemita, se hace necesario el operador IN, que nos permite asignarle un identificador a un campo colección de una relación.

Pero mucho blabla, así que mejor veámolos con un ejemplo. EL siguiente query usa el operador IN para seleccionar elementos de una relación basada en colecciones. Devuelve todas las reservas de todos los clientes:

SELECT R FROM CUSTOMERS AS C, IN (C.RESERVATIONS) R

El operador IN asigna a los elementos individuales del atributo reservations el identificador R. Una vez con este identificador, podemos referenciarlos directamente e incluso referenciarlos en la sentencia EJB QL.

Se darán cuenta, que en la primera y segunda opción no hacen un uso adecuado del operador.

Por otro lado, el operador MEMBER OF es una herramienta poderosa para determianr cuando una entidad pertenece a una relación basada en colecciones específica. Por ejemplo, el siguiente query determina si una entidad Customer (como parámetro de entrada) es miembro de cualquiera de las relaciones entre Reservation y Customer.

SELECT CRS 
FROM CRUISE AS CRS, IN (CRS.RESERVATIONS) AS RES, CUSTOMER AS CUST
WHERE CUST =: MYCUSTOMER
AND
CUST MEMBER OF RES.CUSTOMERS

Se observa que este operador se presta más para la pregunta que IN. Seleccionamos la cuarta, dado que MEMBER OF se aplica sobre colecciones como u.books.







Pregunta tomada de ExamWorx

Publicar un comentario