Давайте посмотрим на ваш запрос:
rows = st.executeQuery("SELECT * FROM applications WHERE name LIKE '%" + name+"%'"
+ " AND (nationality LIKE '" + nationality+"')"
+ " AND (specialty LIKE '" + specialty+"')"
+ " AND (experience LIKE '" + experience+"')");
Здесь, поскольку был задан только name
, остальные значения null
. Если вы пишете этот код для тестирования:
String foo = null;
System.out.println(foo + "");
вывод будет
"нуль"
так, поскольку ваши значения null
, сгенерированный запрос будет
SELECT * FROM applications WHERE name LIKE '%Rowan Atkinson%'
AND (nationality LIKE 'null')
AND (specialty LIKE 'null')
AND (experience LIKE 'null')
Прежде всего, давайте удостоверимся, что вы получите пустое String
в случае null
:
rows = st.executeQuery("SELECT * FROM applications WHERE name LIKE '%" + ((name == null) ? "" : name)+"%'"
+ " AND (nationality LIKE '" + ((nationality == null) ? "" : nationality)+"')"
+ " AND (specialty LIKE '" + ((specialty == null) ? "" : specialty)+"')"
+ " AND (experience LIKE '" + ((experience == null) ? "" : experience)+"')");
Следующая проблема заключается в том, что вы ставите %
только на name
, что также неверно, поэтому давайте исправим это:
rows = st.executeQuery("SELECT * FROM applications WHERE name LIKE '%" + ((name == null) ? "" : name)+"%'"
+ " AND (nationality LIKE '%" + ((nationality == null) ? "" : nationality)+"%')"
+ " AND (specialty LIKE '%" + ((specialty == null) ? "" : specialty)+"%')"
+ " AND (experience LIKE '%" + ((experience == null) ? "" : experience)+"%')");
и теперь прочитайте ответ YCF_L, чтобы использовать именованные параметры для PreparedStatement.