您所在的位置:主页 > Java培训 >

HQL动态查询和动态实例查询

时间:2014-04-25 09:55来源:未知 作者:疯狂java 点击:

  

  实例查询是指在投影查询中返回的结果是一个对象数组,不易操作,为了方便操作,体现面向对象的思想,把返回结果重新组成一个实体的实例。动态查询与动态实例查询没有什么相似之处,把它们放在一起只是名字相近而已,动态查询是指在查询之前并不知道查询内容,而是运行时才知道查询内容的查询。

  1动态实例查询

  讲到动态实例查询还要回顾上一节中的投影查询,在投影查询中如果查询的只是一个属性,比如name,查询返回结果的类型是与属性name的类型相对应,这个容易理解。但是如果是两个属性,比如name和number,它返回的是一个对象数组,而且还要处理顺序,操作起来很不方便,不过还好只有两个。但是如果属性继续增加,比如有10个、20个,工作将会变得很繁琐,而且把一个对象的属性值保存在数组当中,此时,应该把对象的属性保存到对象当中才符合java对象操作思想,这种方式就是动态实例化查询。例如,查询name和number的动态实例查询方式如下:

  String queryString="select new Student)s.id,s.number)from Student as s";

  该查询语句会把查询到得id、name和number封装到Student对象当中作为返回结果。与前面讲到得没有多大差别,主要是在查询语句上有所变化。在select后面,不再是属性,而是一个实体类对象,把查询到得属性值封装到该对象中作为查询结果并返回。不过要注意在实体类Student中要有相应的构造方法,本例在Student中添加如下构造方法:

  构造方法

  public Student(Integer id,String name,String number){

  this.id=id;

  this.name=name;

  this.number=number;

  }

  既然查询结果返回Student对象,就可以通过操作Student对象使用查询结果。

  2.动态查询

  在实际的应用当中,有很多查询不像前面那样,在查询之前就已经确定查询内容。而是在程序运行中才知道查询内容。如图所示为查询窗口,在查询学生信息的过程当中,有的用户输入学生姓名,有的用户可以输入学生学号,还有可能两个都输入,也即在程序之前不确定用户到底输入什么,此时就可以使用动态查询。下面为动态查询学生信息,当用户只输入学生姓名时,按学生下面检索出符合条件的对象;当用户输入学生学号是,则按学生学号进行检索,当用户全部都输入是,则按姓名学号进行检索,当用户全部都输入时,则按姓名和学号进行查询。实现过程其实是通过if语句判断用户输入的内容属于哪一种情况,根据具体情况使用不同的查询语句,虽然这种查询语句很直观,易理解。

  public static List findStudent(String name,String number){

  StringBuffer sb=new StringBuffer("from Srudent s");

  if(name!=null)sb.append("where s.name= :name");

  if(name!=null&&name!=null)sb.append("and s.number= :number");

  if(name!=null&&name!=null)sb.append("where s.number= :number");

  if(name!=null)query.setParameter("name",name);

  if(number!=null)query.setParameter("number",number);

  return query.list();