マップから取得したパラメータを使用してクエリを実行する必要があります。
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();
2つのuserインスタンスを取得します。1つはadmin用、もう1つはname1用です。ただし、上記のコードを使用してまったく同じクエリを設定すると、1つの結果しか得られません(通常は後者のパラメーターの場合)。
: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 CommunityServer5.5を使用しています。このメソッドは、ステートレスセッションBeanにあります。