hibernate查询部分字段
2016-08-17 09:58
225 查看
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=?"
相关文章推荐
- Hibernate中用hql查询部分字段 可解决异常java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to
- Hibernate - 查询部分字段
- Hibernate使用Criteria查询部分字段
- Hibernate查询部分字段并封装到指定类中(HQL)
- Hibernate中用hql查询部分字段
- hibernate查询部分字段
- Hibernate HQL 查询POJO部分字段
- Hibernate查询部分字段并封装到指定类中(HQL)
- Hibernate中用hql查询部分字段
- Hibernate高效查询,只查询部分/指定字段
- Hibernate - 查询部分字段
- hibernate使用createQuery(hql)语句仅查询部分字段,应如何获得数据
- Hibernate高效查询,只查询部分/指定字段
- Hibernate高效查询,只查询部分/指定字段
- Hibernate中用hql查询部分字段
- Hibernate中用hql查询部分字段
- Hibernate高效查询,只查询部分/指定字段
- Hibernate中如何用HQL查询部分字段
- 使用hibernate中getHibernateTemplate查询部分字段
- hibernate-部分字段查询方案