Hibernate— 投影查询

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1723205668/article/details/54408027

我们知道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异常,通过以上给出的解决方案,已经能解决查询部分属性,提高了查询速度。

展开阅读全文

没有更多推荐了,返回首页