问题描述
Query query = this.getSession().createQuery("from CameraEntity c where c.cameraId=:cameraId");query.setString("cameraId", name);List<CameraEntity> list = query.list();if (list.size() > 0) {CameraEntity entity = list.get(0);entity.setCameraId(name);return entity;} else {return null;}使用Hibernate自带的HQL查询和Query query = this.getSession().createQuery("select c.id as id,c.storage as storage from CameraEntity c where c.cameraId=:cameraId");query.setResultTransformer(Transformers.aliasToBean(CameraEntity.class));query.setString("cameraId", name);List<CameraEntity> list = query.list();if (list.size() > 0) {CameraEntity entity = list.get(0);entity.setCameraId(name);return entity;} else {return null;}这样的写法效率差距非常的大。在5000次查询中,第一种方式比第二种的允许时间高9倍左右。但是第一种方式是使用hibernate管理下的,也就是说我对entity进行set之后可以自动更新上数据库,而第二种方式则不会自动更新,需要手动的update才行。如果没有其他原因,这10倍左右的差距之下。如果不需要更新数据那么我查询是不是只用第二种方式这么写就可以了。另外:连接部分已经全部设为lazy抓取。
解决方案
1、第一种方式的耗时估计是session flush时的update造成的可以考虑:1.1、StatelessSession 1.2、session.evict(entity) 从session中移除掉 那么就会变成一个托管对象,更新不会造成update