zoukankan      html  css  js  c++  java
  • 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();
  • 相关阅读:
    lower_bound/upper_bound example
    Counter Mode ( CTR )
    85. Maximal Rectangle
    for_each(c++11)
    Lowest Common Ancestor in a Binary Tree
    python--基础学习(五)参数位置传递、关键字传递、包裹传递及解包裹(*args与**kwargs)
    Python的方法解析顺序(MRO)
    pycharm配置总结
    Python中内置数据类型list,tuple,dict,set的区别和用法
    进程号查找
  • 原文地址:https://www.cnblogs.com/peachwang/p/7418403.html
Copyright © 2011-2022 走看看