Hibernate— 投影查询

我们知道Hibernate框架是ORM(持久层)类型框架,所以有很多数据库优化方式,比如缓存等等,当我们只有查询出某个对象中的1,2个属性时,如果使用HQL的方式的查询,你将会是查询该对象的全部属性!这就代表着,你将会降低查询速度(浪费系统资源),Hibernate框架为此也给出了解决方案:"投影查询"

假设:映射实体对象为 User

具备属性:id,name,age,sex.....

第一种解决方案:

public List<Object[]> getObject(){

Transaction tx = null;

List<Object[]> list= null;

Session session = HibernateSessionFactory.getSession();
try {
tx = session.beginTransaction();
Query q = session.createQuery("select u.name,u.sex from User u");//(查询部分属性)
tx.commit();
} catch (HibernateException e) {
if (tx != null) {
tx.rollback();
}
e.printStackTrace();
}

return list;

}

解析:从方法的返回值来看,我们可以发现投影查询返回的是一个List<Object[]>类型,这是因为我们查询的条件是多个,所以是Object[]数组,如果我们业务层很多

方法都是以对象来传递的,突然来了一个Object[]数组,可能我又要重写一个对应的方法来处理这个家伙,那样投影查询也就得不偿失了!

第二种解决方案:对象查询

public List<User> getUser(){

Transaction tx = null;

List<User> list= null;

Session session = HibernateSessionFactory.getSession();
try {
tx = session.beginTransaction();
Query q = session.createQuery("select new User(u.name,u.sex) from User u"); //对象查询 部分属性
tx.commit();
} catch (HibernateException e) {
if (tx != null) {
tx.rollback();
}
e.printStackTrace();
}

return list;

}

解析:可以看出第二种解决方案返回的对象(被泛型限定的User),这种方式解决了传递Object[]方式,只传递对象了,且也实现了,只查询部分属性,需要注意的是User 映射对象 中必须

要有对应查询语句的构造参数(还要补上一个无参数构造方法,不然在进行merge,saveOrUpdate等方法操作时会报错(复制副本的时候没有无参构造函数))

public User(String name,int sex){

........

}不然会报org.hibernate.hql.ast.QuerySyntaxException异常,通过以上给出的解决方案,已经能解决查询部分属性,提高了查询速度。

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值