Criteria: Mostrar todos alumnos incluso si tienen 0 calificaciones

40 views
Skip to first unread message

Ismael

unread,
Feb 13, 2017, 12:11:11 PM2/13/17
to grailsEnCastellano
Buenas tardes,

def obtenerCantidadCalificaciones(CalificacionGrupo calificacionGrupoInstance){
def c = Calificacion.createCriteria()

def results = c {
calificacionGrupo{
horario{
eq 'id', calificacionGrupoInstance?.horario?.id
}
instrumentoEvaluacion{
eq 'id', calificacionGrupoInstance?.instrumentoEvaluacion?.id
}
}
projections {
groupProperty("alumno")
count("alumno", 'cantidad') //Implicit alias is created here !
}
order 'cantidad'
}

results
}

Esta consulta me devuelve lo que podéis ver en la captura que adjunto.

Mi pregunta es se puede obtener con un critería incluso los alumnos que tienen por cantidad 0 calificaciones.

Saludos.




Captura de pantalla de 2017-02-13 18-08-49.png

Ismael

unread,
Feb 14, 2017, 11:34:59 AM2/14/17
to grailsEnCastellano
Estoy probando con una sentencias HQL.

Pero igualmente no tengo los alumnos cuya cantidad de Calificaciónes es 0 incluso haciendo unos left joins.

/**
* Consulta HQL que obtiene el número de calificaciones de los alumnos para un instrumento dentro de una evaluación
* @param calificacionGrupoInstance
*/
def obtenerCantidadCalificacionesHQL(CalificacionGrupo calificacionGrupoInstance){
String query = """
SELECT CONCAT(a.nombre, ' ', a.apellidoPrimero, ' ', a.apellidoSegundo),
COUNT(c) as Cantidad
FROM Alumno as a
LEFT JOIN a.calificaciones as c
LEFT JOIN c.calificacionGrupo as cg
WHERE cg.instrumentoEvaluacion = :instrumento
AND
cg.evaluacion = :evaluacion
GROUP BY a.id
ORDER BY a.nombre
"""
List queryResults = Alumno.executeQuery(query,
[instrumento: calificacionGrupoInstance?.instrumentoEvaluacion,
evaluacion: calificacionGrupoInstance?.evaluacion])
}

Me he dado cuenta que sino pongo los filtros en el where es decir sin where si que obtengo todos los alumnos y valores cero pero necesito filtrar por evaluación e instrumento de evaluación.

Alguien me hecha una mano o me orienta por donde debo mirar.

Rafael Bermúdez Míguez

unread,
Feb 14, 2017, 12:46:18 PM2/14/17
to grailsenc...@googlegroups.com
Hola Ismael,

te cuento el problema. Si retrocedes a sql , lo que buscas es una condición "on" de join (no un where) 

left join .... where condición -> la condición de where se aplica para filtrar los resultados del join
left join .... on condición -> la condición de on se aplica mientras construye el join

La parte mala: en hql no existe la cláusula on
La parte buena: pero si la cláusula with que viene a resolver este problema.
Ej:
¡Espero que te sirva! Nos comentas,
Un saludo

--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a grailsencastellano+unsub...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a grailsencastellano@googlegroups.com.
Visita este grupo en https://groups.google.com/group/grailsencastellano.
Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
________________________________
 
Rafael Bermúdez Míguez,
Twitter: @rafbermudez

Ismael

unread,
Feb 15, 2017, 9:49:12 AM2/15/17
to grailsEnCastellano
Muchas gracias no conocía la clausula with. He estado jugando con ella y tengo una excepción razón por la que no he escrito antes algo.

/**
* Consulta HQL que obtiene el número de calificaciones de los alumnos para un instrumento dentro de una evaluación
* @param calificacionGrupoInstance
*/
def obtenerCantidadCalificacionesHQL(CalificacionGrupo calificacionGrupoInstance){
String query = """
SELECT CONCAT(a.nombre, ' ', a.apellidoPrimero, ' ', a.apellidoSegundo),
COUNT(c) as Cantidad
FROM Alumno a
LEFT JOIN fetch a.calificaciones c
LEFT JOIN c.calificacionGrupo cg WITH cg.instrumentoEvaluacion = :instrumento AND cg.evaluacion = :evaluacion
GROUP BY a.id
ORDER BY a.nombre
"""
List queryResults = Alumno.executeQuery(query,
[instrumento: calificacionGrupoInstance?.instrumentoEvaluacion,
evaluacion: calificacionGrupoInstance?.evaluacion])
}

URI
/calificacion/introducir
Class
org.hibernate.hql.ast.InvalidWithClauseException
Message
with clause can only reference columns in the driving table [ SELECT CONCAT(a.nombre, ' ', a.apellidoPrimero, ' ', a.apellidoSegundo), COUNT(c) as Cantidad FROM cuadernodigital.Alumno a LEFT JOIN fetch a.calificaciones c LEFT JOIN c.calificacionGrupo cg WITH cg.instrumentoEvaluacion = :instrumento AND cg.evaluacion = :evaluacion GROUP BY a.id ORDER BY a.nombre ]


He estando mirando el error y ya sé lo que es una driving table. Pero claro si hago solo un left join si que me funciona pero en el momento que encadeno un left join más deja de funcionar. Muchas gracias pero ahora he llegado a otro callejón, seguiré investigando a ver que averiguo.

Para publicar en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.

Visita este grupo en https://groups.google.com/group/grailsencastellano.
Para acceder a más opciones, visita https://groups.google.com/d/optout.
Message has been deleted

Ismael

unread,
Feb 15, 2017, 10:21:44 AM2/15/17
to grailsEnCastellano
De hecho hay algo curioso se supone que en esta consulta la driving table es alumno puesto que la clave foránea esta en calificacion. Y sin embargo funciona, como puedes ver en las capturas adjuntas.

   /**
* Consulta HQL que obtiene el número de calificaciones de los alumnos para un instrumento dentro de una evaluación
* @param calificacionGrupoInstance
*/
def obtenerCantidadCalificacionesHQL(CalificacionGrupo calificacionGrupoInstance){
String query = """
SELECT CONCAT(a.nombre, ' ', a.apellidoPrimero, ' ', a.apellidoSegundo),
COUNT(c) as Cantidad
FROM Alumno a
LEFT JOIN a.calificaciones c WITH c.nota = 'B1'
GROUP BY a.id
ORDER BY a.nombre
"""
        List queryResults = Alumno.executeQuery(query)
}
}
Captura de pantalla de 2017-02-15 16-14-10.png
Captura de pantalla de 2017-02-15 16-17-12.png
Reply all
Reply to author
Forward
0 new messages