hibernate學習---單表查詢

咱們都知道SQL是很是強大的,爲何這麼說呢?相信學過數據庫原理的同窗們都深有體會,SQL語句變化多端,好絕不誇張的說能夠實現任意符合咱們須要的數據庫操做,既然前面講到Hibernate很是強大,因此Hibernate也是可以實現SQL的一切數據庫操做。sql

 

在SQL中,單表查詢是最經常使用的語句,同理Hibernate最經常使用到的也是查詢語句,因此今天就來說講Hibernate的單表查詢:數據庫

  

今天要將的內容分如下幾點:緩存

  • 查詢全部
  • 查詢結果排序
  • 爲查詢參數動態賦值
  • 分頁查詢
  • 模糊查詢
  • 惟一性查詢
  • 聚合函數查詢
  • 投影查詢
  • 分組查詢
  • 單表查詢的迭代
  • 命名查詢

Hibernate不只爲咱們提供了它自己的查詢語句HQL,同時也還提供了SQL和criteria標準查詢,接下來咱們都會來一一實驗。服務器

廢話很少說,直接上代碼:session

查詢全部:

  SQL:app

 String sql = "select * from t_student";
        List<Student> list =session.createSQLQuery(sql).addEntity(Student.class).list();
        for(Student student:list) {
            System.out.println(student);
        }
        //sql語句和咱們原生的sql語句同樣,查詢後的
        //createSQLQuery(sql)這個返回的是一個sql語句,經過查詢得到的是一個結果集(Set),而後Hibernate經過addEntity進行封裝,返回一個list集合,裏面裝着封裝好的Student對象。

 

HQL:函數

 String hql = "from Student";//這裏放的是Student類,由於HQL查詢時面向對象的。
        List <Student>list = session.createQuery(hql).list();//正由於查詢是面向對象的,因此不須要封裝。
        for(Student student:list) {
            System.out.println(student);
        }

 

QBC(Query By Criteria):spa

 List <Student>list = session.createCriteria(Student.class).list();
        for(Student student:list) {
            System.out.println(student);
        }
        //它也是面向對象查詢,只須要將Student Class對象最爲參數就行,連語句都不須要0.0

 

查詢結果排序:

SQL:.net

String sql = "select * from t_student order by t_age desc";
//降序,升序爲asc
        List<Student> list =session.createSQLQuery(sql).addEntity(Student.class).list();

 

HQL:hibernate

String hql = "from Student order by age desc";
        List <Student>list = session.createQuery(hql).list();

 

QBC:

List <Student>list = session.createCriteria(Student.class).addOrder(Order.desc("age")).list();

//session.createCriteria(Student.class).addOrder(Order.asc("age")).list();

//QBC的特殊查詢,每一個查詢都會對應方法

 

爲查詢參數動態賦值:

  接下來咱們只驗證HQL語句,由於SQL語句和咱們學過的都同樣,以前只是演示了它在Hibernate中的用法。

  在JDBC中咱們可使用預處理語句來提升效率,而且能夠用來防止SQL注入攻擊,Hibernate一樣能夠完成相似的操做:

//方法一:
String hql = "from Student where age>?";
        List <Student>list = session.createQuery(hql).setInteger(0, 25).list();
        //setInteger(0, 25)位置從0開始,JDBC是從1開始
//方法二:
String hql = "from Student where age>:age";//以冒號開頭起別名
List <Student>list = session.createQuery(hql).setInteger("age", 25).list();
//方法三:
String hql = "from Student where age>?";
        List <Student>list = session.createQuery(hql).setParameter(0, 25).list();
        //這裏設置參數要注意數據類型,若是類中字段定義的是Double類型,那麼setParameter(0, 25)參數25應該爲寫爲25.0

 

分頁查詢:

在SQL中分頁查詢時很是重要的了,在Hibernate中也一樣是。 
在傳統的SQL語句中分頁查詢的語句爲:

select*from table limit startIndex,pageSize;

 

HIbernate裏面的分頁不是經過語句來實現的,而是經過方法對session操做來實現的:

      int page = 2;//前臺須要分頁的時候通常會向後臺提交頁數
        int pageSize = 3;//由前臺傳回須要每頁幾條數據
        int firstResult = (page-1)*pageSize;//結果集是從零開始

        List <Student>list = session.createQuery(hql).setFirstResult(firstResult).setMaxResults(pageSize).list();
    //這樣就完成了咱們的分頁

 

模糊查詢:

一樣Hibernate也提供了模糊查詢:

//方法一:
String hql = "from Student where name like '%張%'";
        List <Student>list = session.createQuery(hql).list();
//方法二:
String hql = "from Student where name like ?";
        List <Student>list = session.createQuery(hql).setString(0, "%張%").list();
//方法三:
String hql = "from Student where name like:name";
        List <Student>list = session.createQuery(hql).setString("name", "%張%").list();

 

惟一性查詢:

String hql = "from Student where id=:id";
        Student student = (Student)session.createQuery(hql)
                                    .setInteger("id", 1)
                                    .uniqueResult();
                                    //以前咱們獲得的都是list集合,經過.uniqueResult();能夠獲得單個結果集,也就是封裝好的單個對象。

 

聚合函數查詢:

String hql = "select count(*) from Student ";
        Long count = (Long)session.createQuery(hql)
                                          .uniqueResult();
//聚合函數count查詢出來的數是long數據類型,也是uniqueResult

 

投影查詢:

投影查詢也就是查詢部分字段。如:id,name,age,score 
咱們只須要查詢name,age,就叫作投影查詢。

String hql = "select new Student(name,age) from Student ";
        List<Student> list = session.createQuery(hql)
                                             .list();
//由於hql語句是面向對象的查詢,因此投影查詢須要new一個含有所投影字段的對象(同時要在實體類中添加對應是構造函數)

 

分組查詢:

String hql = "select age from Student group by age having count(age)>4 ";
        List<Integer> list = session.createQuery(hql)
                                         .list();
//對於查詢單個的字段,由於有數據類型與它對應,因此不須要新建對象,能夠直接查詢。 HQL分組查詢和SQl查詢方法基本一致 

 

Query接口的iterator

iterator(迭代器)首先會從session緩存中查詢咱們須要的內容,若是沒有咱們須要的內容,而後去數據庫用sql語句查詢。 

屢次查詢相同的內容咱們能夠用到Hibernate的緩存特性(session),能夠加快查詢的效率。 

傳統的咱們用HQL查詢的時候,每次都須要去數據庫中查詢,這樣若是查詢一樣的內容就會形成數據庫服務器負載太重(例如新聞主頁,就會屢次查詢相同內容),當第一次查詢事後session沒有clear或者close以前咱們已經查詢過的內容都會在session中緩存,因此當第二次查詢的時候咱們就可使用迭代器了。 

咱們知道從session中讀取數據遠遠比從數據庫中讀取數據要快。

可是,迭代器對於沒有查詢過的內容(也就是session緩存中沒有要查詢的數據的時候),效率會特別低,因此咱們建議對於一樣查詢,第一次使用list查詢,第二次及之後使用iterator迭代。

 

命名查詢:

咱們也能夠將常常用到的查詢語句在咱們Hibernate主配置文件中配置好。

<!--注意,query標籤是<hibernate-mapping>的子標籤-->
<query name="queryById">from Student where id=:id</query>
//使用getNamedQuery方法來得到配置文件中的查詢語句。
    Student student = (Student)session.getNamedQuery("queryById").setInteger("id", 1).uniqueResult();

到這裏咱們就將Hibernate的基本單表查詢學的差很少了(我這裏只列舉了咱們常用到的一些操做)。

相關文章
相關標籤/搜索