hibernate三套查询

          hibernate 有三套查询,我这里总结一下,方便以后自己查询用。

 一、HQL查询(Hibernate Query Language)
    sql查询:   表     行    列   (select * from stu_info)
    hql查询: 持久类  对象  属性  (select s from Student as s)
    操作步骤:
    a. 得到Session.
    b. 定义hql语句。
    c. Query query = 调用session.createQuery(hql)创建查询.
       为hql语句中的占位符设置参数setParameter(int position, Object val).
       如果要分页查询的话调用:
       query.setFirstResult((当前页码 - 1) * 每页显示的数量); limit ?,? 的第一个问号。
       query.setMaxResults(每页显示的数量); limit ?,? 的第二个问号。
    d. 调用query的list()得到查询结果,如果你明确知道只有一条记录返回那就可以调用uniqueResult();
      
    1. from子句:
       语法:
       from 持久化类 [as s 对象|别名]  from User as s | from User | from User s
    
    2. select子句:能够明确查询哪些列。
       语法:
       select 对象名 from 持久化类 [as s 对象|别名]   --> List
       select 对象.属性, 对象.属性 from 持久化类 [as s 对象|别名] --> List


    3. 关联(面向对象)与连接(数据库):
       a. 隐式关联: @ManyToOne、@OneToOne (关联的是实体属性)


          select s from 持久化类 s where s.关联的实体属性.属性 (ognl)


       b. 显式关联: @OneToMany、@ManyTOMany (关联的是集合属性)
          
 select t from 持久化类 t inner join t.关联的集合属性 s where s.属性 = ? (ognl)


       c. 抓取连接:join fetch
          select s from 持久化类 s join fetch s.关联的属性.


    4. 聚集函数:统计函数
       max、min、count()、avg()、sum()


    5. order by : 排序


    6. group by : 分组


    7. having : 分组后过滤。


    8. where 子句: 设置过滤条件。
       hql语句能支持的表达式,运算符算符特别多。(用法与sql语句差不多).
       -- 支持常用的运算符与表达式:
          =、<、<=、>、>=、!=、not、distinct、between ... and、like、or、and
 between, is null, is not null, is empty, is not empt、 concat(...,...)


       -- 支持操作集合运算符:
          size()|size, minelement(), maxelement(), minindex(), maxindex()


       -- EJB-QL:
          substring(), trim(), lower(), upper(), length(), locate(), abs(), sqrt(),
 bit_length(), mod()


    9. 子查询:与sql语句用法完全一样把子查询部分放在()里面。
       in 、not in


    10. 多态查询。
        hibernate能够完全理解类的继承关系,当你查询父类时,它会把父对象查询出来,并且还会把子类对象查询出来。
from java.lang.Object


    11. 命名查询(Named Query)。
        它是把所有的查询语句,写在一个专门的xml文件中,到时你通过一个名字就可访问它。

第一种方式:
 xxx.hbm.xml文件。
       
 a. hql语句


 b.


 c. Query query = session.getNamedQuery("起个名字")


第二种方式:
 a. 在持久化类上加注解: 
    @NamedQuery(name="起个名字", query="hql语句")








二、Criteria(条件查询):
    不需要写任何查询语句 hql + sql都不需要写,完全面向对象。
    操作步骤:
    a. 得到Session.
    b. Criteria criteria = 调用session.createCriteria("持久化类")创建查询.
       criteria.setFirstResult((当前页码 - 1) * 每页显示的数量); limit ?,? 的第一个问号。
       criteria.setMaxResults(每页显示的数量); limit ?,? 的第二个问号。
    c. 调用criteria的list()得到查询结果,如果你明确知道只有一条记录返回那就可以调用uniqueResult();
    
    Criteria类的方法:
    1. add(Criterion) : 添加查询条件。
       a. Restrictions 工具类专门创建查询条件,把表达式,运算符改成了静态的方法。
              如果找不对应的方法就直接用sqlRestriction(sql)方法。
            
   Restrictions.le("age", 300) --> Criterion


       b. Property   工具类专门创建查询条件。
            Property.forName("属性名").le(300) --> Criterion


       c. Criterion 代表一个查询条件。


    2. addOrder(Order) : 添加排序.
       a. Order类生成排序对象:
          -- Order.asc("属性名")
 -- Order.desc("属性名")


       b. Property类:
          -- Property.forName("属性名").asc();
 -- Property.forName("属性名").desc();


    3. setProjection(Projection) : 设置查询哪些列。(投影就是基于列的运算)
       a. Projections 创建列的工具类。
          Projections.property("name") --> 创建Projection.


       b. ProjectionList: 组合查询的多列。
          ProjectionList pl = Projections.projectionList();
 pl.add(Projections.property("name"));
 pl.add(Projections.property("age"));


    4. setFetchMode() : 抓取连接。
       -- setFetchMode("关联实体属性", FetchMode.JOIN) // 立即加载
       -- setFetchMode("关联实体属性", FetchMode.SELECT) // 延迟加载
       
    5. createAlias() : 创建关联查询。
用createAlias创建关联查询,添加的查询条件还是为持久化类添加的


    6. createCriteria() : 创建关联查询。
       用createCriteria创建关联查询,添加的查询条件是为关联实体添加的.




    7. 离线查询(DetachedCriteria): 相当于定义了一条查询语句
       a. 创建:
          DetachedCriteria dc = DetachedCriteria.forClass(Student.class);
       b. 查询:
          Criteria criteria = dc.getExecutableCriteria(session);


       离线查询的主要目的是为了做子查询!
          
   
三、Native Sql Query(原生的sql查询)
    SQLQuery ---> Query子类
    操作步骤:
    a. 得到Session.
    b. 定义sql语句。
    c. SQLQuery query = 调用session.createSQLQuery(sql)创建查询.
       为hql语句中的占位符设置参数setParameter(int position, Object val).
       如果要分页查询的话调用:
       query.setFirstResult((当前页码 - 1) * 每页显示的数量); limit ?,? 的第一个问号。
       query.setMaxResults(每页显示的数量); limit ?,? 的第二个问号。
    d. 调用query的list()得到查询结果,如果你明确知道只有一条记录返回那就可以调用uniqueResult();


    SQLQuery类:


    1. addEntity() : 实体查询


    2. addScalar() : 标量查询(标明查询哪些列)


    3. addJoin()  : 关联查询
       addJoin("t", "s.teacher") : 关联查询(将t开头的数据,关联到学生的teacher属性里)


    4. 命名查询。


       第一种方式在配置文件(xxx.hbm.xml):
       

sql语句












第二种方式在持久化类上加注解:
@NamedNativeQuery(name="sql_query_2", resultSetMapping="rs", query="sql语句"/>
        @SqlResultSetMapping(name="rs", entities={}, columns={})

你可能感兴趣的:(JAVAEE)