Consultas en JPA-QL Sistemas de Persistencia de Objetos Contenidos ene-09 Alberto MFA [email protected] 2 Preparación y ejecución ene-09 Alberto MFA [email protected] 3 Creación HQL y JPA QL QBC y QBE SQL Directo ene-09 (Query By Criteria) Alberto MFA [email protected] 4 Paginación El primer resultado es el 0 Las Query permiten encadenamiento de métodos ene-09 Número máximo de filas a recuperar desde la fijada por setFirstResult() Ejecuta la consulta y devuelve una List() de objetos User Alberto MFA [email protected] 5 Enlace de parámetros Lo que no se debe hacer ¿Qué hay en este string? ¿Qué pasa si escriben esto en un formulario? Es el problema de la SQL injection ene-09 Alberto MFA [email protected] 6 Enlace de parámetros Enlace nominal (recomendado) setParameter() sobrecargado para java.util.Date, java.util.Calendar y Object (ver documentación) ene-09 Alberto MFA [email protected] 7 Enlace de parámetros Enlace posicional El orden de parámetros no tiene por qué ser secuencial ¡Ojo! Se empieza en 1 setters sobrecargados ene-09 Alberto MFA [email protected] 8 Ajustes de rendimiento ene-09 Alberto MFA [email protected] 9 Ajustes de rendimiento Los “hints” son todos dependientes de implementación, no estándar JPA Si un hint no es soportado es ignorado silenciosamente ene-09 Alberto MFA [email protected] 10 Hints: ejemplos ene-09 Alberto MFA [email protected] 11 Ejecución Se produce al invocar a: getResultList() getSingleResult() Excepción si más de uno o ninguno Así ya no… pero puede no haber ninguno ene-09 Alberto MFA [email protected] 12 Consultas con nombre Se carga el string de la consulta desde mapeos createNamedQuery(…) Query con anotaciones o en orm.xml ene-09 Alberto MFA [email protected] 13 ene-09 Alberto MFA [email protected] 14 Consultas básicas ene-09 Alberto MFA [email protected] 15 Partes de una consulta Selección Restricción Fuente de datos FROM Una sola o combinación de ellas Filtrado de filas WHERE Proyección ene-09 Selección de partes de las filas que pasan el filtro SELECT Alberto MFA [email protected] 16 Partes de una consulta FROM WHERE Resultados Tabla Criterios de selección de filas Curso 2005-2006 SELECT SID2-GAP Puede que haya menos filas (WHERE) y puede que menos campos (SELECT) 17 Selección (FROM) SELECT en JPA QL, no necesario en HQL Alias necesarios para condiciones sobre miembros select i from Item i select i from Item as i select i from Item i Las consultas son polimórficas ene-09 ¡Sube toda la BDD! select b from BillingDetail b select o from java.lang.Object o select s from java.io.Serializable s Alberto MFA [email protected] También polimorfismo sobre 18 interfaces Restricción (WHERE) WHERE para filtrar filas ene-09 Alberto MFA [email protected] 19 Restricción (WHERE) ene-09 Alberto MFA [email protected] 20 Operadores de comparación y precedencia _ + ene-09 Alberto MFA [email protected] 21 Restricciones sobre colecciones (WHERE) En el WHERE Se pueden complementar con funciones ene-09 Alberto MFA [email protected] 22 JPA Funciones Hibernate ene-09 Alberto MFA [email protected] 23 Ordenación De la forma usual ene-09 Alberto MFA [email protected] 24 Proyección (Esta consulta es inútil ya que da un producto cartesiano) Cada fila es un vector de los elementos proyectados (Item y Bid) ene-09 Alberto MFA [email protected] 25 Proyección de escalares En la select pueden ir atributos de clases… … y resultados de funciones (las ya vistas) ene-09 Alberto MFA [email protected] 26 Consulta sobre varias tablas + Tabla Criterios de filtrado de filas Resultados Combinación de registros de las dos tablas Tabla Curso 2005-2006 SID2-GAP 27 Joins: inner, left y right outer Todos los Items con sus Bids Los Items que tienen ene-09 Bids Alberto MFA [email protected] 28 Joins implícitos en asociaciones Cuando se accede a propiedades a lo largo de un camino (path) Bid join Item Item join User Acceso a propiedad También se puede usar en select ene-09 Alberto MFA [email protected] 29 Joins implícitos Solo se permiten en caminos (path) que pasen a través de asociaciones manyto-one o one-to-one El final del camino NO puede ser multivaluado P.e. item.bids.amount es ilegal Solo en SELECT y WHERE ene-09 Alberto MFA [email protected] 30 Joins implícitos traducidos a SQL ene-09 Alberto MFA [email protected] 31 Joins en FROM Cuando el camino de asociaciones resulta en un conjunto many-to-many one-to-many ene-09 Alberto MFA [email protected] 32 Joins en FROM También left y right join Los Item %name% y sus Bids aunque haya Item que no tienen Bids ene-09 Alberto MFA [email protected] 33 Join explícito traducído a SQL ene-09 Alberto MFA [email protected] 34 Fetch join en FROM Salvo mapeo en contra todas las colecciones se cargan lazy La configuración de mapeo se puede sobrecargar para una consulta concreta si se usa fetch join para colecciones El efecto es que se cargan todos los elementos de la colección asociada al momento (eager fetching) Es un ajuste fundamental en el rendimiento de algunas consultas ene-09 Alberto MFA [email protected] 35 Fetch join en FROM Se cargan los Item que pasan la restricción y sus colecciones asociadas de Bids de forma agresiva (eager), no lazy El resultado es una List() de Item. Ya no son pares. ene-09 Alberto MFA [email protected] 36 Fetch join en FROM También se puede usar para cargar de forma agresiva el extremo one de asociaciones one-to-one y many-to-one many-to-one Si no pone left también carga de forma agresiva item y bidder pero solo los bids que tienen item y bidder ene-09 Nota: JPA por defecto carga eager asociaciones …-to-one; esto es útil si hay mapeo fetch=LAZY y se quiere forzar eager para una consulta Alberto MFA [email protected] 37 Fetch join: recovecos No se puede usar un alias en SELECT ni WHERE No se debe hacer fetch join más de una colección (problema del producto cartesiano) La estrategia del mapeo se ignora Se pueden cargar duplicados setMaxResults(…) y setFirstResult(…) se desaconsejan ene-09 Alberto MFA [email protected] 38 Fetch join recovecos Se pueden cargar duplicados, para evitarlos … No se puede usar un alias en SELECT ni WHERE ene-09 Alberto MFA [email protected] 39 Theta-style en WHERE El ajuste del join se hace en el WHERE Es práctico para consultas sobre clases no asociadas Da pares ene-09 Alberto MFA [email protected] 40 Comparación de identificadores equivalentes Diferencia: la primera no carga Item, la segunda sí ene-09 Alberto MFA [email protected] 41 Comparación de id en ejecución ene-09 Alberto MFA [email protected] 42 Consultas de agregados ene-09 Alberto MFA [email protected] 43 Funciones en SELECT count() min() max() sum() avg() ene-09 Alberto MFA [email protected] 44 Consulta de totales GROUP BY Formación de grupos + Tabla Criterios de selección de filas Funciones de agregados Cálculos sobre los grupos Tabla Grupos resultado Selección de grupos HAVING Curso 2005-2006 SID2-GAP 45 Agrupamiento Cláusula GROUP BY (como en SQL) Como en SQL cualquier propiedad o alias que aparezca en SELECT fuera de una función de agregado debe aparecer también en la cláusula GROUP BY ene-09 Alberto MFA [email protected] 46 Restricción de grupos con HAVING Mismas reglas que en SQL Solo puede aparecer en HAVING una función de agregado o una propiedad (o alias) usado en GROUP BY ene-09 Alberto MFA [email protected] 47 Instanciación dinámica en SELECT Las consultas que no devuelven entidades pueden tener más rendimiento al no meter resultados en contexto de persistencia ene-09 Cada fila devuelve un objeto de la clase que se especifica La clase debe existir y no necesita estar mapeada Alberto MFA [email protected] 48 Subselects En SQL una subselect puede ir en SELECT, FROM o WHERE En JPA QL sólo puede ir en el WHERE Las debe soportar la BDD ene-09 MySQL en versiones anteriores a 4.?? no tiene subselects Alberto MFA [email protected] 49 Subselects Correlada: puede tener peor rendimiento No correlada: no tiene impacto de rendimiento Siempre entre paréntesis ene-09 Alberto MFA [email protected] 50 Cuantificación Una subselect puede devolver una sola fila (normalmente resultado de una función de agregado) o varias En el caso de varias se usan con cuantificación ene-09 ALL, ANY (o SOME), IN Alberto MFA [email protected] 51 Cuantificación ejemplos ene-09 Alberto MFA [email protected] 52 Funciones con subselect implícitas ene-09 Alberto MFA [email protected] 53