Другим сценарием является то, что вы нанесли нулевой объект в тип значения . Например, код ниже:
object o = null;
DateTime d = (DateTime)o;
Он выкинет NullReferenceException
в роли. В приведенном выше примере это кажется совершенно очевидным, но это может произойти в более «поздних связующих» сложных сценариях, где нулевой объект был возвращен из некоторого кода, которого вы не являетесь, и приведение, например, генерируется некоторой автоматической системой.
Одним из примеров этого является этот простой фрагмент привязки ASP.NET с элементом управления календарем:
" />
Здесь SelectedDate
на самом деле является свойством - типа DateTime
- типа Calendar
Web Control, и привязка может отлично вернуть что-то null. Неявный генератор ASP.NET создаст кусок кода, который будет эквивалентен приведенному выше методу. И это поднимет NullReferenceException
, что довольно сложно определить, потому что он лежит в сгенерированном ASP.NET коде, который компилирует отлично ...
Существуют конкретные способы реализации этого поставщика, поэтому было бы хорошо знать, какую базу данных вы используете. Я знаю решения для PostgreSQL и H2. Я реализовал эту функцию в базе данных H2, так что это то, что я знаю лучше всего:
H2 Database
PreparedStatement prep = conn.prepareStatement(
"select * from users where login in (select * from table(x int = ?))");
prep.setObject(1, new Object[] { "1", "2" });
ResultSet rs = prep.executeQuery();
PostgreSQL
WHERE login = ANY(?)
Затем установите параметр к массиву значений с использованием PreparedStatement.setArray (..) (not setObject как для H2).
//---
String query = "SELECT * FROM users WHERE login = ?";
List<Login> list = new ArrayList<Login>();
Login login = null;
for(String param : conditions){
pStmt.setString(1,param);
rSet = pStmt.executeQuery();
if(rSet.next()){
login = new Login();
login.setName(rSet.getString(1));
list.add(login);
}
}
return list;
//---
условия будут списком элемента, на основе которого вы хотите получить поля.
Посмотрите здесь для обзора доступных опций. Насколько я могу вам сказать, каждый динамически генерирует необходимое количество символов-заполнителей (с некоторыми оптимизациями).
В PreparedStatement
существует метод setArray
, но иногда его использование не представляется возможным. Вы можете попробовать попробовать.
Если параметр Spring JDBCTemplate Spring является опцией, вы можете использовать автоматическое расширение коллекции, как описано здесь .