2017-01-12 4 views
0

Ich habe eine Abfrage wie:Hibernate bulkUpdate() mit Liste als Parameter

@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 
} 

Und in meiner DAO Klasse, ich habe die folgende Methode:

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

Wenn die Methode aufgerufen wird, ich erhalten

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

So sieht es aus wie die bulkUpdate() Methode nicht korrekt Liste Parameter analysieren kann, ich wonde Was ist der richtige Weg?

Antwort

1

Sie haben diesen Fehler erhalten, weil Sie den Namen einer benannten Abfrage als erstes Argument anstelle der Abfragezeichenfolge übergeben. Und wenn Sie Ihre Abfragezeichenfolge senden, wird es auch mit ClassCastException fehlschlagen. Sie müssen benannte Parameter anstelle von "?" um mehrere Werte zu binden.

Ich glaube, der richtige Weg, es zu tun ist Hibernate direkt über HibernateCallback. Zuerst die Abfrage ändern, um benannte Parameter zu verwenden:

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

Und dann die deleteTeams Methode mit ersetzen:

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); 
} 
Verwandte Themen