I need to make a query with parameters taken from a Map.
public String executeQuery(String string, Map<String, String> params) {
try {
Query query = em.createQuery(string);
System.out.println(em.createQuery(string).getClass());
for(String key:params.keySet()) {
query.setParameter(key, params.get(key));
System.out.println("query.setParameter("+key+","+ params.get(key)+");");
}
List<?> list = query.getResultList();
return list.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
The following works great:
Query query = em.createQuery("select u from User u where u.email=:email or u.name=:name");
query = query.setParameter("email","admin");
query = query.setParameter("name","name1");
List<?> list = query.getResultList();
return list.toString();
I get two instances of user, one for admin and one for name1.
However, when I set the very same query using the code above, I get only one result (usually for the latter parameter).
Whether I use :name or ?1 doesn’t matter.
Each setParameter() inside the foreach has the correct parameters.
The query after the foreach block has both parameters set right – I used this to check it (?1 syntax):
"Parameters: "+query.getParameter("name").getName()+ ": "+ query.getParameterValue("name")+", "+query.getParameter("email").getName() +": "+query.getParameterValue("email");
I use Glassfish 3.1.2, Hibernate 4.1.5 SP1, MySQL Community Server 5.5.
The method lays in a stateless session bean.
The problem was in the Map, I parsed the parameters from one string divided by new line separator.
As the split parameter I used \n, which left some empty char at the end of all words except the last one.
I should have used: