首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用List作为参数的Hibernate bulkUpdate()

使用List作为参数的Hibernate bulkUpdate()
EN

Stack Overflow用户
提问于 2017-01-13 04:14:57
回答 1查看 642关注 0票数 0

我有一个查询,比如:

代码语言:javascript
复制
@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类中,我有以下方法:

代码语言:javascript
复制
@Override
@Modifying
public void deleteTeams(Long acctId, List<String> teams) {
    getHibernateTemplate().bulkUpdate(
            SparkTeam.DELETE_TEAMS,
            new Object[] {acctId, teams}
);

当调用该方法时,我会得到

代码语言:javascript
复制
java.lang.IllegalArgumentException: node to traverse cannot be null!

所以看起来bulkUpdate()方法不能正确解析列表参数,我想知道正确的方法是什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-13 23:22:53

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

我相信正确的方法是通过HibernateCallback直接使用hibernate。首先,将查询更改为使用命名参数:

代码语言:javascript
复制
" where s.acctId=:p1 and s.teamName in (:p2)")

然后将deleteTeams方法替换为:

代码语言:javascript
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41622162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档