2017-01-12 19 views
0

は、私のようなクエリたパラメータとして:私は、メソッドが呼び出され休止bulkUpdate()

@Override 
@Modifying 
public void deleteTeams(Long acctId, List<String> teams) { 
    getHibernateTemplate().bulkUpdate(
      SparkTeam.DELETE_TEAMS, 
      new Object[] {acctId, teams} 
); 

@Entity 
@Table(name="sparkteams") 
@NamedQueries({ 
     @NamedQuery(name = SparkTeam.DELETE_TEAMS 
       , query = "delete from SparkTeam s" + 
       " where s.acctId=? and s.teamName in (?)") 
}) 

public class SparkTeam implements Persistent{ 
    private Long acctId; 
    private String teamName; 
    // entity class definitions 
} 

をそして、私のDAOクラスで、私は次のメソッドを持っています私はwonde、

java.lang.IllegalArgumentException: node to traverse cannot be null! 

を取得するだから、正しくリストパラメータを解析することはできませんbulkUpdate()方法のように見えますどのような正しい方法ですか?

答えて

1

名前付きクエリの名前をクエリ文字列ではなく最初の引数として渡すため、このエラーが発生します。また、クエリ文字列を送信すると、ClassCastExceptionで失敗します。 「?」の代わりに名前付きのパラメータを使用する必要があります。複数の値をバインドする

これを行う正しい方法は、HibernateCallbackを使ってHibernateを直接使用することです。 まず、名前付きパラメータを使用するクエリを変更します。

" where s.acctId=:p1 and s.teamName in (:p2)") 

をし、次いでdeleteTeamsメソッドを置き換えます。

public void deleteTeams(final Long acctId, final List<String> teams) { 
     HibernateCallback<Integer> deleteCallback = new HibernateCallback<Integer>() { 

     @Override 
     public Integer doInHibernate(Session session) 
       throws HibernateException, SQLException { 

      return session.getNamedQuery(SparkTeam.DELETE_TEAMS) 
        .setParameter("p1", acctId) 
        .setParameterList("p2", teams) 
        .executeUpdate(); 
     } 

    }; 
    getHibernateTemplate().execute(deleteCallback); 
}