以List作为参数的Hibernate bulkUpdate()

时间:2017-01-12 20:14:57

标签: java hibernate jpql

我有一个类似的查询:

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

@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参数,我想知道正确的方法是什么。

1 个答案:

答案 0 :(得分:1)

您收到此错误是因为您将命名查询的名称作为第一个参数而不是查询字符串传递。如果您发送查询字符串,它也会因ClassCastException而失败。您必须使用命名参数而不是&#34;?&#34;绑定多个值。

我认为正确的方法是直接通过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);
}