Hibernate查询

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();
原文地址:https://www.cnblogs.com/peachwang/p/7418403.html