HQL查询
1)按条件查询
HQL中可以追加查询条件,条件中写的是属性名,之后在执行查询前用query对吸那个为条件参数赋值。如:
String hql="from service where unioHost=?"; Session session=HiberateUtil.getSession(); Query query=session.createQuery(hql); query.setString(0,"192.168.0.23"); List<service> service=query.list();
2)查询一部分字段
1)使用HQL查询时可以只查询表中的一部分字段,需要在from之前追加select语句,并且明确指定要查询的列对应的属性名如:
String hql="select id,unixHost,UserName "+"from service";
注:
当查询一部分字段时,query.list()方法返回的集合中封装的不再是实体对象,而是一个Object[],数组中的值与 select语句后面的属性按顺序对应。
分页查询
Hibernate的分页查询不是通过HQL条件实现的,而是通过API统一实现,需要通过API设置出分页的起点和每页显示的行数如:
int from=(page-1)*pageSize; query.setFirstResult(from); query.setMaxResults(pageSize);
注意:
1)查询的起点是本页第一行,按照JDBC计算,公式为(page-1)*pageSize+1
2)Hibernate中行数的起点从0开始计算的,不同于JDBC中从1开始计算,所以计算公式应该是在JDBC的计算公式基础-1,即(page-1)*pageSize.
多表联合查询
1)Hibernate支持使用HQL进行多表联合查询,不过HQL中写的是关联的对象及属性名
2)Hibernate中有3种使用HQL实现关联查询的方式,分别是
-----对象方式关联
-----join方式关联
-----select字句关联
3)对象方式关联 如:
String hql="select sid,s.UserName"+ "s.unixHost,a.id,a.realName,a.idcardNo"+
"from service s, Account a"+ "where s.account.id=a.id";
4)join方式关联 如:
String hql="select s.id,s.UserName, "+ "s.unixHost,a.id,a.realName,a.idcardNo"+ "from Account a inner join a.services s" ;
注意:join时,不能直接join对象,需要join自身的属性
5)select子句关联 如:
String hql="select id, UserName, " "unixHost,account.id,account.realName,"+ "account.idcardNo"+ "from service";
直接使用SQL查询
如果业务太复杂,无法通过HQL实现查询功能,Hibernate也支持直接使用SQL进行查询,参考代码如下:
String sql="select * from SERVICE where UserName=?"; Session session=HibernateUtil.getSession(); SQLQuery query=session.createSQLQuery(sql); query.setString(0,"xiaohua"); List<Object[]> list=query.list(); //本次查询返回的集合中,封装的是Object[]
使用criteria查询
Hibernate还支持使用一个criteria的API来动态拼一个HQL 如:
Criteria c=session.createCriterial(service.class); c.add(Restrictions.eq("unixHost","192.168.0.26")).add(Restrictions.or(Restrictions.eq("UserName","guojing"),Restrictions.eq("UserName","huangr"))); List<service> list=c.list();