hibernate查询部分字段

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)


  1. VO 是用 new 关键字创建,由 GC 回收的。
  2. VO 是值对象,精确点讲它是业务对象,是存活在业务层的,是业务逻辑使用的,它存活的目的就是为数据提供一个生存的地方。
  3. VO 的属性是根据当前业务的不同而不同的,也就是说,它的每一个属性都一一对应当前业务逻辑所需要的数据的名称。
  4. 以上都是百度,我理解的意义:现在为了查一个对象,只用到其中某些值,要查所有的值,太!慢!,前段时间发现可以在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=?"
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值