foreach中使用setParameter的JPA设置参数就好像只设置了一个参数一样

时间:2012-08-08 12:01:46

标签: hibernate jpa parameters

我需要使用从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中。

1 个答案:

答案 0 :(得分:2)

问题出现在Map中,我从一个字符串除以新行分隔符中解析出参数。 作为我使用的分割参数\ n,它在除了最后一个之外的所有单词的末尾留下了一些空字符。

我应该使用:

String[] lines = parameters.split(System.getProperty("line.separator"));