我需要使用从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;
}
}
以下效果很好:
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();
我得到两个用户实例,一个用于admin,一个用于name1。 但是,当我使用上面的代码设置相同的查询时,我只得到一个结果(通常用于后一个参数)。
我是否使用:名称或?1无关紧要。 foreach中的每个setParameter()都有正确的参数。 foreach块后面的查询都设置了正确的参数 - 我用它来检查它(?1语法):
"Parameters: "+query.getParameter("name").getName()+ ": "+ query.getParameterValue("name")+", "+query.getParameter("email").getName() +": "+query.getParameterValue("email");
我使用Glassfish 3.1.2,Hibernate 4.1.5 SP1,MySQL社区服务器5.5。 该方法位于无状态会话bean中。
答案 0 :(得分:2)
问题出现在Map中,我从一个字符串除以新行分隔符中解析出参数。 作为我使用的分割参数\ n,它在除了最后一个之外的所有单词的末尾留下了一些空字符。
我应该使用:
String[] lines = parameters.split(System.getProperty("line.separator"));