¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Capturando SQLException e lançando RuntimeException com a consulta falhada em Java: É possível recuperá-la de um PreparedStatement?

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 1 Vistas
0
Cargando...

Ao realizar uma consulta SQL, gostaria de capturar qualquer SQLException e lançar uma RuntimeException que contenha a consulta falhada, como segue:

try {

String QUERY_STRING = "SELECT * FROM table WHERE id = ? ";

stmt.setString(1, 100);

Preparedstatement stmt = con.prepareStatement( QUERY_STRING )

stmt.executeUpdate( );

}

catch (SQLException exc) {

throw new RuntimeException( <query> );

}

Onde a consulta seria "SELECT * FROM TABLE WHERE id = 100". No entanto, parece que não é possível recuperar esta consulta de um PreparedStatement?

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

2 Respuestas

0
Cargando...

Existem duas maneiras de resolver este problema:-

(1) A forma mais simples é encapsular os parâmetros e a cadeia de consulta na exceção. Isso não resolverá seu problema 100%, mas será descritivo o suficiente para lidar com o erro. Fragmento de código abaixo-

String param = 100;

String QUERY_STRING = "SELECT * FROM table WHERE id = ? ";

try {

stmt.setString(1, param);

Preparedstatement stmt = con.prepareStatement( QUERY_STRING )

stmt.executeUpdate( );

}

catch (SQLException exc) {

throw new RuntimeException(QUERY_STRING + " os parâmetros são: " + param );

}

(2) Você pode criar um método utilitário onde passará a cadeia de consulta e a lista de parâmetros. Basta substituir todos os '?' pelo parâmetro correspondente. Fragmento de código abaixo-

String param = 100;

String QUERY_STRING = "SELECT * FROM table WHERE id = ? ";

try {

stmt.setString(1, param);

Preparedstatement stmt = con.prepareStatement( QUERY_STRING )

stmt.executeUpdate( );

}

catch (SQLException exc) {

String query = getQueryString(QUERY_STRING, param);

throw new RuntimeException(query);

}

Nota: para um método generalizado, passe o segundo argumento como Lista, para que possa inserir qualquer quantidade arbitrária de parâmetros na consulta.

Espero que isso resolva seu problema.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Olá,

A razão pela qual isso não funciona é que uma declaração preparada é enviada realmente para o banco de dados com um ? no parâmetro para permitir que o servidor do banco de dados compile a consulta apenas uma vez e use a substituição de variáveis (procure Oracle Shared Pool para entender melhor por que isso é importante para o desempenho) em vez de uma recompilação completa a cada nova consulta que usa diferentes parâmetros.

Então, a resposta curta é que você não pode obter a string completa da consulta SQL da declaração preparada (sem escrever/encontrar uma classe proxy que funcione para primitivos e strings).

A resposta mais longa é que você pode fazer isso envolvendo a Declaração Preparada com um proxy de depuração, mas mesmo assim pode não permitir que você obtenha toda a saída correta.

A maneira mais fácil de lidar com a situação e obter um resultado legível toda vez é simplesmente criar um mapa que corresponda aos setters e depois fazer uma simples substituição do ? na string de consulta que você então adiciona à exceção que você lança como mensagem.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?