Если я правильно прочитал ваш вопрос, вам нужен обобщенный способ вызова запроса, который использовал именованные параметры, передавая список, содержащий пары имя / значение для привязки.
Это довольно просто.Я опускаю использование обобщений для ясности.
String query="select p from Person p where name=:name and family=:family";
String[] parameterArray = new String[] {"name", "myName", "family","myFamily"};
List parameters = Arrays.asList(parameterArray);
List results = callQuery(session, query, parameters);
public List callQuery(Session session, String query, List parameters) {
Query query = session.createQuery(query);
if (parameters != null && !parameters.isEmpty()) {
for (int i = 0; i < parameters.size(); i+=2) {
query.setParameter(parameters[i],parameters[i+1]);
}
}
return query.list();
}
Альтернативой является использование карты, которая делает итерацию по параметрам, чтобы добавить их в запрос немного чище;Я также нахожу, что это делает добавление их в коллекцию более понятным для передачи в общий метод:
String query="select p from Person p where name=:name and family=:family";
Map<String,Object> parameters = new HashMap<String,Object>();
parameters.put("name","myName");
parameters.put("family,"myFamily");
List results = callQuery(session, query, parameters);
public List callQuery(Session session, String query, Map<String,Object> parameters) {
Query query = session.createQuery(query);
if (parameters != null && !parameters.isEmpty()) {
for (Map.Entry<String,Object> entry : parameters) {
query.setParameter(entry.getKey(),entry.getValue());
}
}
return query.list();
}
Я также рекомендовал бы изучить NamedQueries над использованием встроенных строк, поскольку они позволяютвключите запросы в ваше сопоставление xml / annotations и добавьте некоторую проверку синтаксиса запросов.