我需要使用从地图中获取的参数进行查询。
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();
我得到两个用户实例,一个用于管理员,一个用于 name1。但是,当我使用上面的代码设置相同的查询时,我只得到一个结果(通常是后一个参数)。
无论我使用 :name 还是 ?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 Community Server 5.5。该方法位于无状态会话 bean 中。