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出来的实例为同一状态
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=?"