Query nativa - Spring Data JPA

9 respostas
G

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…
}

9 Respostas

Jonathan_Medeiros

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.

Lucas_Camara

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/

G

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!!

G

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?

Jonathan_Medeiros

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

G

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

Lucas_Camara

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.

G

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.

Lucas_Camara

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.

Criado 30 de junho de 2021
Ultima resposta 30 de jun. de 2021
Respostas 9
Participantes 3