Как установить параметр Integer как null в запросе Hibernate?
У меня есть объект:
@Entity
@Table(name = "smsc.security_users")
public class User {
@Id
@Column(name = "id")
private int id;
@Column(name = "username")
private String username;
@Column(name = "password")
private String password;
@Column(name = "enabled")
private int enabled;
@Column(name = "master_id", nullable = true)
private Integer master_id;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "passwordExpiration")
private Date passwordExpiration;
public String getUsername() {
return username;
}
...
Я говорю о master_id
. И это мой метод DAO:
public void add(String userName, String password, Integer master_id) {
Session session = null;
session = this.sessionFactory.getCurrentSession();
Query query = session
.createSQLQuery(
"INSERT INTO smsc.security_users(id,username,password,enabled,passwordExpiration,master_id) VALUES(smsc.SeqDictID.nextval+1,:userName,:password,1,:passwordExpiration,:master_id)")
.setString("userName", userName)
.setString("password", Sha1.getHash(password))
.setTimestamp("passwordExpiration", DateUtil.getTomorrow())
.setInteger("master_id", master_id);
int updated = query.executeUpdate();
}
Журнал говорит:
Ошибка обработки запроса; вложенное исключение java.lang.NullPointerException
и помещает указатель в эту строку:
.setInteger("master_id", master_id);
master_id
иногда должен иметь значение null. Итак, как я могу установить null?
Ответы
Ответ 1
Если вы проверяете документацию класса Query, setInteger(),
Query setInteger(String name,int val)
В качестве параметров требуется имя и примитивный тип int.
Когда вы передаете тип оболочки Integer, значение которого равно null, во время autoboxing появляется исключение null-указателя.
Например:
Integer x = null;
int y = x; // gives a nullpointer exception.
Вы можете использовать
Query setParameter(String name,
Object val,
Type type);
для установки нулевых значений.
См. также:
Hibernate: Как установить значение параметра NULL-запроса в HQL?
Ответ 2
Для нулевого объекта укажите его как:
query.setParameter("name", object, StandardBasicTypes.INTEGER);
StandardBasicTypes.INTEGER
заменен Hibernate.INTEGER
(и т.д.)