现在的位置: 首页 > 综合 > 正文

如何在HQL的参数中传入null值

2017年12月02日 ⁄ 综合 ⁄ 共 1775字 ⁄ 字号 评论关闭

首先写一个简单的实体类Student

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Student {
	private Long id;
	private String name;

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

再写一个查询Student的HQL语句,用setLong的方法赋一个null值

package test.run;

import org.hibernate.Session;
import org.hibernate.tutorial.util.HibernateUtil;

import test.domain.Student;

public class Test {
	public static void main(String[] args) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		session.beginTransaction();

		Student student = new Student();
		student.setId(null);
		Student result = (Student) session.createQuery("from Student where id =:id").setLong("id", student.getId()).uniqueResult();

		System.out.println(result);

		session.getTransaction().commit();
	}
}

程序运行后,会抛出java.lang.NullPointerException

Exception in thread "main" java.lang.NullPointerException
	at test.run.Test.main(Test.java:16)

将setLong方法换成setParameter(String name, Object val, Type type),就不会出现NullPointerException的异常。

API文档描述如下:

Parameters:

name - the name of the parameter

val - the possibly-null parameter value

type - the Hibernate type

可知val的值是可以为空的。

import org.hibernate.Session;
import org.hibernate.tutorial.util.HibernateUtil;
import org.hibernate.type.StandardBasicTypes;

public class Test {
	public static void main(String[] args) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		session.beginTransaction();

		Student student = new Student();
		student.setId(null);
		Student result = (Student) session.createQuery(
				"from Student where (id =:id)").setParameter("id", student.getId(), StandardBasicTypes.LONG)
				.uniqueResult();

		System.out.println(result);

		session.getTransaction().commit();
	}
}

抱歉!评论已关闭.