以 List 作为参数的 Hibernate bulkUpdate()

Hibernate bulkUpdate() with List as parameters

我有一个查询:

@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 class 中,我有以下方法:

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

当方法被调用时,我得到

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

看来bulkUpdate()方法无法正确解析List参数,请问正确的方法是什么

您收到此错误是因为您将命名查询的名称而不是查询字符串作为第一个参数传递。如果您发送查询字符串,它也会因 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);
}