consideran este método simple:¿Cómo se pueden manejar los valores NULL y regulares sin utilizar diferentes declaraciones preparadas?
public ResultSet getByOwnerId(final Connection connection, final Integer id) throws SQLException {
PreparedStatement statement = connection.prepareStatement("SELECT * FROM MyTable WHERE MyColumn = ?");
statement.setObject(1, id);
return statement.executeQuery();
}
Se supone que el método de ejemplo para seleccionar todo, desde alguna mesa en la que iguale el valor de una columna, que deben ser simple. El feo detalle es que pasar NULL para el id resultará en un ResultSet vacío, sin importar cuántas filas haya en el DB porque SQL define NULL como no obligatorio, ni siquiera NULL. La única manera de seleccionar las filas que conozco es el uso de un diferente cláusula where:
SELECT * FROM MyTable WHERE MyColumn IS NULL
Por desgracia, la única manera de hacer que el método funcione correctamente en todos los casos parece ser la de tener dos pathes de ejecución totalmente diferentes, uno para el caso donde el argumento id es nulo y uno para valores regulares.
Esto es muy feo y cuando tienes más de una columna que se puede anular puede ser muy complicado rápidamente. ¿Cómo se pueden manejar valores NULL y normales con la misma ruta/declaración de código?
No consumo JDBC, pero en C# que generalmente configurar esta opción para que los '='/'SE null' seleccionados de forma dinámica?. El parámetro, si lo hay, sigue vinculado a través de la declaración preparada. –
Si está utilizando SQL Server, puede hacer 'SET ANSI_NULLS OFF' y' field = NULL' funcionará. – NullUserException
Considera Hibernate o JPA. Te salvará del estándar de JDBC. – BalusC