三.检索方式 1.分页查询 List result = this.getSession().createQuery("from Customer c order by c.name asc") .setFirstResult(0).setMaxResults(10).list(); 2.条件查询 //如果hql语句中含有参数可以使用以下方法提高安全性: Object[] args = {name,order}; //传入的查询条件的变量名字 Type[] types = {Hibernate.STRING,Hibernate.entity(Order.class)}; //变量类型 //Type[]是hibernate提供的变量类型,order为自定义对象类型。 //根据参数说在位置的索引值,传入的变量名字,变量类型来进行查询。 List list = this.query("from Customer c where c.name=? and c.order=?",args,types) public List query(String hql, Object[] args, Type[] types){ Query query = this.getSession().createQuery(hql); query.setParameters(args, types); return query.list(); } 3.批量延迟检索 映射文件中<set>元素有一个batch-size属性,用于为延迟检索或立即检索策略设定批量检索的数量。 注:批量检索的属性值范围不宜过大,如果过大就失去了延迟加载的意义,如果太小也会失去批量检索的意义。 一般设置为:3-10。合理的运用批量检索可以提高检索性能。具体请查阅说明文档。 4.检索单个对象 Customer customer = (Customer)this.getSession().createQuery("from Customer c order by c.name asc") .setMaxResults(1).uniqueResult(); 5.隐式内连接 //标准的HQL内连接查询语句: "from Customer c inner join c.orders"; //如果Customer类中没有orders集合属性,可以采用SQL风格的隐式内连接查询语句: "from Customer c,Order o where c.in=o.customer_id"; 6.分组查询 //例如以下查询语句仅统计具有一条以上订单的客户的所有订单的总价: "select c.id,c.name,sum(o.price) from Customer c join c.orders o group by c.id having (count(o)>1)"; 7.HQL查询的select子句 "select new map(c.name as personName) from Customer c" //HQL语句返回的结果是集合,其中集合元素是Map对象,以personName作为Map的key。 8.SQL查询通过对象属性显示 //SimpleJdbcTemplete是spring为hibernate查询提供的工具类 SimpleJdbcTemplete simpleJdbcTemplete; List<Map<String,Object>> list = simpleJdbcTemplete.queryForList(sql.toString(), new Object[]{});