Métodos que fazem consulta HQL ou SQL - qual a melhor forma?

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

Cara, não vou dizer oq ta certo nem errado pq não tenho experiência para isso, mas enfim, já precisei também criar alguns métodos com “appends” nas querys pq era a melhor abordagem para o que eu queria fazer, não seria errado utilizar.

Quando suas entidades estão bem mapeadas inclusive os relacionamentos, você trabalhar com orientação a objetvo na consulta, HQL no caso, é uma mão na roda. Isso quando você quer trazer uma entidade mesmo.

No caso de você precisar trazer campos específicos de várias tabelas, não vejo problemas em utilizar query nativa. Quando preciso trabalhar com vários atributos, sempre crio uma Classe com esses atributos e seto na mão o resultado da query, pegando pelo indice.

A vantagem do HQL é que é muito mais fácil vc fazer escalonamento no servidor de aplicação do que no servidor de banco de dados. Por isso frameworks trazem muito para a camada de aplicação (caches, lógicas, etc) ao invés de recorrer a stored procedures em bancos de dados.

Agora, procure ferramentas de profiling e meça a performance. Só isso realmente te dirá qual caminho é o melhor para sua aplicação.

[quote=ViniGodoy]A vantagem do HQL é que é muito mais fácil vc fazer escalonamento no servidor de aplicação do que no servidor de banco de dados. Por isso frameworks trazem muito para a camada de aplicação (caches, lógicas, etc) ao invés de recorrer a stored procedures em bancos de dados.

Agora, procure ferramentas de profiling e meça a performance. Só isso realmente te dirá qual caminho é o melhor para sua aplicação.[/quote]

Certo. E quanto à legibilidade e reutilização desse código, é bom? Eu não sei se ele está de um jeito bom, se há anti-patterns para código que mistura SQL, se há patterns (só conheço DAO).