Olá pessoal,
Trabalho em uma empresa que está fazendo uma migração de um sistema em Visual Basic para Java (JEE) mas acaba sendo que a maior parte do sistema são consultas ao banco de dados, usando tanto HQL (Hibernate Query Language) ou SQL nativo mesmo.
Vejo algumas consultas realmente grandes e complexas lá e fico em dúvida de qual seria a melhor forma de fazê-las, um exemplo a seguir:
public List<Map<String, Object>> listarDisciplinasAluno (String codAluno, Short serieAluno, String turma, Boolean isApenasMatriculadas //Varios outros parametros opcionais) {
String query =
"SELECT d.codDisciplina as codigoDisciplina,
d.nomeDisciplina as nomeDisciplina,
t.codTurma as codigoTurma,
do.nomeDocente as nomeDocente,
... //CONTINUA com outros campos de outras tabelas
FROM Disciplina d
JOIN d.turma t
JOIN t.docente do
WHERE a.codigoAluno = :codAluno
AND t.turma IN (...)"; //Mais um monte de JOIN, AND, CASE, etc.
Map parametros = .... //Map com os parametros para a consulta.
if(turma != null) {
consulta += " AND turma = :turma";
parametros.put("turma", turma);
}
if(isApenasMatriculadas) {
consulta+= " AND d.matriculada = true AND t.codTurma NOT IN ..... " //Mais uma porrada de regra.
}
return dao.consultaSql(consulta, parametros);
}
Enfim, gostaria muito da opinião de vocês sobre o design, estilo e qualidade desse tipo de método.
É bom fazer esses parâmetros que são opcionais (como turma, serie e matriculados apenas) fazerem esse “append” na consulta?
É melhor fazer um método com a consulta cheia de parâmetros e opções para reaproveitar ou fazer outras consultas em outros métodos? (A legbilidade da forma escrita acima fica horrível)
E quanto a esse retorno de Map<String, Object>? É perdoável? Percebam que são vários campos de vários objetos, não se poderia trazer apenas uma entidade.
Não é uma coisa muito orientada a objeto não é? (Estamos mais seguindo a maneira como está feita em VB do que Java orientado a objetos mesmo…)
Qualquer sugestão e crítica, em especial, são muito bem vindas. Pois gostaria de sugerir melhorias à gerência mas não tenho ideia se o que fazemos está certo ou da melhor maneira mesmo.
Grato