我有一个查询,比如:
@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()方法不能正确解析列表参数,我想知道正确的方法是什么。
发布于 2017-01-13 23:22:53
出现此错误是因为您将命名查询的名称作为第一个参数传递,而不是作为查询字符串传递。如果你发送你的查询字符串,它也会因为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);
}https://stackoverflow.com/questions/41622162
复制相似问题