hibernate查询
hibernate,使用中会发生这样的情况,有一个实体如Employee它字段多而且也关联了许多实体,这时候当我查询所有的在职Employee时候,只用到了它的id和name但是却不得已需要查出所有的字段。这种查询很怂而且很慢。
在经过一顿瞎搞之后总结出了两种比较有效的过滤方式.
1. 实体增加构造方法,hql直接new 该实体,传入字段
2. 使用VO,调用Hibernate:setResultTransformer方法
实体增加构造
故名思意就是在实体中增加构造函数,在hql直接使用new传入构造方法
@Entity
public class Employee implements Serializable{
public Employee(){}
public Employee(long id,String name_cn){
setId(id);
setName_cn(name_cn);
}
public Employee(long id,String name_cn,String jobName){
this(id,name_cn);
setJobName(jobName);
}
}
在hql里通过使用 new关键字来,调用构造方法,减少查询出来的字段
String hql=”select new Employee(e.id,e.name_cn) from Employee e”;
使用实体增加构造的方法来限制查询字段有缺陷,无法实现级联查询,而且实体关系过于复杂,破坏了实体类的统一性,无法保证每次new出来的实例为同一状态
使用Vo来减少查询字段
VO值对象(Value Object)
- VO 是用 new 关键字创建,由 GC 回收的。
- VO 是值对象,精确点讲它是业务对象,是存活在业务层的,是业务逻辑使用的,它存活的目的就是为数据提供一个生存的地方。
- VO 的属性是根据当前业务的不同而不同的,也就是说,它的每一个属性都一一对应当前业务逻辑所需要的数据的名称。
- 以上都是百度,我理解的意义:现在为了查一个对象,只用到其中某些值,要查所有的值,太!慢!,前段时间发现可以在hql里使用构造函数,后来就使用构造函数达到减少查询,但是使用构造函数,会修改到实体类,虽然没什么不好但是感觉怪怪的,而且无法实现联级查询字段,用起来不方便。VO相当于在数据查询加了一层model,只查询出使用的属性的字段设置到VO里。
要使用VO,在hibernate底层QUERY查询需修改为
Query query = getSession().createQuery(hql).setResultTransformer((Transformers.aliasToBean(clazz)));
使用VO需定义VO,同时hql select出来的字段要与VO定义的相同:
class VO{
private id,name,orgName;
getter,setter;
}
hql="select e.id as id,e.name as name,e.org.name as orgName from Employee e where e.deleteStatus=?"