@SuppressWarnings("unchecked") public List<Map<String, Object>> getEstadistiquesProfessorQuestionarisByAssignatura( int codiAssignatura) { String strQuery = "select qst " + ", (" // nota mitja de tots els alumnes de l'assignatura actual + "select avg(rq.nota) " + "from RespostaQuestionari rq " + "where rq.alumne.codi in (" + "select alu.codi " + "from Alumne alu " + "where alu.assignatura.codi = ass.codi" + ") " + "and rq.questionari.codi = qst.codi" + ") " + ", ((" // temps de resposta mig de tots els alumnes de l'assignatura actual + "select avg(rq.tempsResposta) " + "from RespostaQuestionari rq " + "where rq.alumne.codi in (" + "select alu.codi " + "from Alumne alu " + "where alu.assignatura.codi = ass.codi" + ") " + "and rq.questionari.codi = qst.codi" + ")/1000) " + "from RespostaQuestionari rsq " + "inner join rsq.questionari qst " + "inner join rsq.assignador.assignatura ass " + "where rsq.contestat = :contestat " + "and rsq.corregit = :corregit " + "and ass.codi = :assignatura " + "order by qst"; Query q = em.createQuery(strQuery); q.setParameter("contestat", Boolean.TRUE); q.setParameter("corregit", Boolean.TRUE); q.setParameter("assignatura", codiAssignatura); List<Object[]> llistaArrayObjectes = q.getResultList(); List<Map<String, Object>> estadistiquesProfessor = new ArrayList<Map<String, Object>>(llistaArrayObjectes.size()); for (Object[] arrayObjectes : llistaArrayObjectes) { Questionari questionari = (Questionari) arrayObjectes[0]; Float notaMitjaAss = parsejaFloat(arrayObjectes[1]); Float tempsRespostaMigAss = parsejaFloat(arrayObjectes[2]); // El temps de resposta mig i la nota mitja del qüestionari a nivell de tot Egradus // el trobarem directament a questionari.getNotaMitja() i questionari.getTempsRespostaMig(); Map<String, Object> liniaEstadistiquesProfessor = new HashMap<String, Object>(); liniaEstadistiquesProfessor.put(EstadistiquesDao.QUESTIONARI_CODI, questionari.getCodi()); liniaEstadistiquesProfessor.put(EstadistiquesDao.QUESTIONARI_NOM, questionari.getNom()); liniaEstadistiquesProfessor.put( EstadistiquesDao.QUESTIONARI_DESCRIPCIO, questionari.getDescripcio()); liniaEstadistiquesProfessor.put(EstadistiquesDao.NOTA_MITJA_ASSIGNATURA, notaMitjaAss); liniaEstadistiquesProfessor.put( EstadistiquesDao.NOTA_MITJA_EGRADUS, questionari.getNotaMitja()); liniaEstadistiquesProfessor.put( EstadistiquesDao.TEMPS_RESPOSTA_MIG_ASSIGNATURA, tempsRespostaMigAss); liniaEstadistiquesProfessor.put( EstadistiquesDao.TEMPS_RESPOSTA_MIG_EGRADUS, (Float) (questionari.getTempsRespostaMig().floatValue() / 1000)); estadistiquesProfessor.add(liniaEstadistiquesProfessor); } // Agrupam les estadístiques anteriors per Questionari de manera explícita, (ja que JPQL no dóna // suport a realitzar funcions d'agrupació sobre subqueries). Per això ens ajudarem d'un mètode // privat 'agrupaEstadistiquesPer()' Set<String> keysPerAgrupar = new HashSet<String>(); keysPerAgrupar.add(EstadistiquesDao.NOTA_MITJA_ASSIGNATURA); keysPerAgrupar.add(EstadistiquesDao.NOTA_MITJA_EGRADUS); keysPerAgrupar.add(EstadistiquesDao.TEMPS_RESPOSTA_MIG_ASSIGNATURA); keysPerAgrupar.add(EstadistiquesDao.TEMPS_RESPOSTA_MIG_EGRADUS); estadistiquesProfessor = agrupaEstadistiquesPer( estadistiquesProfessor, EstadistiquesDao.QUESTIONARI_CODI, EstadistiquesDao.NUM_CONTESTACIONS, keysPerAgrupar); return estadistiquesProfessor; }
@SuppressWarnings("unchecked") public List<Map<String, Object>> getRespostesQuestionari(Alumne alumne) { String strQuery = "select qst " + ", rsq.codi " + ", rsq.nota " + ", rsq.tempsResposta " + ", rsq.dataContestacioFi " + ", rsq.dataCorreccio " + ", (" + "select avg(rq.nota) " + "from RespostaQuestionari rq " + "where rq.alumne.codi in (" + "select alu.codi " + "from Alumne alu " + "where alu.assignatura.codi = (" + "select alu2.assignatura.codi " + "from Alumne alu2 " + "where alu2.codi = rsq.alumne.codi" + ")" + ") " + "and rq.questionari.codi = rsq.questionari.codi" + ") " + ", ((" + "select avg(rq.tempsResposta) " + "from RespostaQuestionari rq " + "where rq.alumne.codi in (" + "select alu.codi " + "from Alumne alu " + "where alu.assignatura.codi = (" + "select alu2.assignatura.codi " + "from Alumne alu2 " + "where alu2.codi = rsq.alumne.codi" + ")" + ") " + "and rq.questionari.codi = rsq.questionari.codi" + ")/1000) " + "from RespostaQuestionari rsq " + "inner join rsq.questionari qst " + "where rsq.contestat = :contestat " + "and rsq.corregit = :corregit " + "and rsq.anonim = :anonim " + "and rsq.alumne = :alumne " + "order by rsq.dataCorreccio"; Query q = em.createQuery(strQuery); q.setParameter("contestat", Boolean.TRUE); q.setParameter("corregit", Boolean.TRUE); q.setParameter("anonim", Boolean.FALSE); q.setParameter("alumne", alumne); List<Object[]> llistaArrayObjectes = q.getResultList(); List<Map<String, Object>> estadistiquesAlumne = new ArrayList<Map<String, Object>>(llistaArrayObjectes.size()); for (Object[] arrayObjectes : llistaArrayObjectes) { Questionari questionari = (Questionari) arrayObjectes[0]; Integer codiRq = (Integer) arrayObjectes[1]; Float nota = parsejaFloat(arrayObjectes[2]); Float tempsResposta = (Float) (parsejaLong(arrayObjectes[3]).floatValue() / 1000); Date dataContestacioFi = (Date) arrayObjectes[4]; Date dataCorreccio = (Date) arrayObjectes[5]; Float notaMitjaAss = parsejaFloat(arrayObjectes[6]); Float tempsRespostaMigAss = parsejaFloat(arrayObjectes[7]); Map<String, Object> liniaEstadistiquesAlumne = new HashMap<String, Object>(); liniaEstadistiquesAlumne.put(EstadistiquesDao.QUESTIONARI_CODI_RQ, codiRq); liniaEstadistiquesAlumne.put(EstadistiquesDao.QUESTIONARI_CODI, questionari.getCodi()); liniaEstadistiquesAlumne.put(EstadistiquesDao.QUESTIONARI_NOM, questionari.getNom()); liniaEstadistiquesAlumne.put( EstadistiquesDao.QUESTIONARI_DESCRIPCIO, questionari.getDescripcio()); liniaEstadistiquesAlumne.put(EstadistiquesDao.NOTA, nota); liniaEstadistiquesAlumne.put(EstadistiquesDao.NOTA_MITJA_ASSIGNATURA, notaMitjaAss); liniaEstadistiquesAlumne.put(EstadistiquesDao.NOTA_MITJA_EGRADUS, questionari.getNotaMitja()); liniaEstadistiquesAlumne.put(EstadistiquesDao.TEMPS_RESPOSTA, tempsResposta); liniaEstadistiquesAlumne.put( EstadistiquesDao.TEMPS_RESPOSTA_MIG_ASSIGNATURA, tempsRespostaMigAss); liniaEstadistiquesAlumne.put( EstadistiquesDao.TEMPS_RESPOSTA_MIG_EGRADUS, (Float) (questionari.getTempsRespostaMig().floatValue() / 1000)); liniaEstadistiquesAlumne.put(EstadistiquesDao.DATA_CONTESTACIO_FI, dataContestacioFi); liniaEstadistiquesAlumne.put(EstadistiquesDao.DATA_CORRECCIO, dataCorreccio); estadistiquesAlumne.add(liniaEstadistiquesAlumne); } return estadistiquesAlumne; }