1

我需要使用从地图中获取的参数进行查询。

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 中。

4

1 回答 1

2

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

我应该使用:

String[] lines = parameters.split(System.getProperty("line.separator"));
于 2012-08-09T07:49:58.677 回答