Query nativa - Spring Data JPA

Olá pessoa,

Estou com uma dúvida, onde trabalho utilizamos JavaSE, e por ser um sistemas de PDV tem algumas query bem complexa, não utilizamos JPA+Hibernate, e agora estou migrando pro spring e preciso executar uma query para retornar um resultado do banco de dados.

O problema é que o objeto que quero popular os dados ele não é uma entity no banco de dados.

Segue exemplo meu para ter uma ideia melhor da situação.

Nesse sql estou fazendo via JDBC,um sql puro e retornando o dado num resultset,mas sei que
ísso não é a melhor maneira,dei uma olhada em JPQL mas ainda sim não sei se da pra adaptar a minha situação.

Obs:esse código é meu e pessoal, não da empresa que trabalho.

Connection conn = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	List<DailyClosing> list = new ArrayList<DailyClosing>();
	DailyClosing dailyClosing = null;

	try {
		conn = ConnectionJdbc.getConexao();

		String sql = " SELECT "
				+" (SELECT SUM(v.total) AS v FROM order v WHERE v.forma_pagamento = 1 AND v.id_caixa = #ID) AS dinheiro, "
				+" (SELECT SUM(v.total) AS v FROM order v WHERE v.forma_pagamento = 2 AND v.id_caixa = #ID) AS cartao_credito, "
				+" (SELECT SUM(v.total) AS v FROM order v WHERE v.forma_pagamento = 3 AND v.id_caixa = #ID) AS cartao_debito, "
				+" (SELECT SUM(v.total) AS v FROM order v WHERE v.forma_pagamento = 4 AND v.id_caixa = #ID) AS brinde, "
				+" (SELECT SUM(v.total) AS v FROM order v WHERE v.forma_pagamento = 5 AND v.id_caixa = #ID) AS pix, "
				+" (SELECT SUM(v.total) AS v FROM order v WHERE v.forma_pagamento = 6 AND v.id_caixa = #ID) AS outros "
				+"	FROM comanda c "
				+"	LIMIT 1 ";

		sql = sql.replaceAll("#ID", String.valueOf(id));
		stmt = conn.prepareStatement(sql);
		rs = stmt.executeQuery();

		if(rs.next()) {

…populo os dados como preciso…
}

JPA em si não necessariamente precisa das entidades para ser usado, porém se você não usa entidades você está colocando uma carga desnecessária no projeto, afinal, a ideia do JPA é manter o mínimo de contato possível com SQL puro, deixando que o mesmo faça este trabalho partindo do mapeamento de suas entidades!

Porém como sua necessidade parte da escrita de SQL puro, e você não possui entidades para o caso citado, sugiro o uso de JDBC Template.

Concordo com o @Jonathan_Medeiros, JPA irá te trazer mais problemas do que solução nesse seu caso. Também recomendo que vá de JdbcTemplate: https://mkyong.com/spring/spring-jdbctemplate-querying-examples/

Eu utilizo JPA em algumas entidades,mas nesse caso específico é tipo um objeto para um relatório, acredito que essa forma não está sendo a melhor,mas está funcionando,vou dar uma conferida no Jdbc template e deixo aqui se conseguir resolver.

Obrigado!!

Vou olhar mais a fundo,mas acredito que era isso que estava procurando,e pelo que vi já é com spring,o que facilitaria o processo de conexão (no caso acima estou fazendo manual), agora só uma dúvida, em projetos onde se precisa de uma query complexa essa solução é bastante utilizada??
Pois tem algumas query além de complexa podem demorar um tempo considerável para executar,então nesse caso o sql puro é uma boa alternativa para essas situações?

Um não substituí o outro, ambos se complementam, tu pode usar os dois tranquilamente no projeto se assim preferir!

1 curtida

Mas isso que fiz de pegar uma connection e usar o sql puro não pode ser visto como uma má prática?

Talvez em um projeto Spring seja uma prática ruim, pois ele já abstrai essa complexidade para vc com o jdbcTemplate. Porém, o uso em si de pegar a conexão diretamente não pode ser considerada uma prática ruim. Essa é a especificação para conexão de banco de dados onde os drivers de banco se apoiam.

O uso de SQL puro também não é prática ruim de jeito maneira. O que existem são cenários onde usar determinado recurso/framework/tecnologia será melhor do que outro.

1 curtida

Exatamente isso, talvez me expressei mal em perguntar se é uma má prática, minha pergunta seria em relação a estar utilizando o Spring e fazer isso de utilizar o sql puro,como fiz no exemplo.
Mas como você já mencionou, determinados cenários precisam de query mais complexa e com um grande resultado de dados, mas são coisas bem especificas.

1 curtida

A boa prática que mencionei tb tem a ver sobre usar uma Connection diretamente.

Isso que vc perguntou:

Como o Spring fornece o JdbcTemplate, não há necessidade de trabalhar com Connection diretamente, mas em projetos que não há esse tipo de abstração, trabalhar com jdbc puro não seria considerado má prática.