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