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();

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にあります。

4

1 に答える 1

2

問題はマップにあり、1つの文字列を改行区切り文字で割ったものからパラメーターを解析しました。分割パラメータとして\nを使用しました。これにより、最後の単語を除くすべての単語の最後に空の文字が残りました。

私は使うべきだった:

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