Hibernate查詢方式
- 2019 年 10 月 4 日
- 筆記
查詢方式
1.OID
2.HQL
3.QBC
01
OID查詢
什麼是OID查詢?
通過domain類中(映射文件設置的)OID屬性進行查詢
有兩種方法?
一個是get,一個是load
get是立馬生成sql語句到資料庫去查詢並封裝成指定對象然後返回
load它不會去立刻查詢而是生成一個代理對象由於沒有去查詢它只包含你給的OID,直到你用到其他屬性才會去查詢給你

02
HQL方式
什麼是HQL?
HQL查詢:Hibernate Query Language,Hibernate的查詢語言
是一種面向對象的方式的查詢語言,語法類似SQL。
通過session.createQuery(),用於接收一個HQL進行查詢方式。
簡單查詢
//查詢整個表:createQuery("from 類名 (別名)") Query query = session.createQuery("from Course"); List<Course> courses = query.list(); for (Course c : courses) { System.out.println(c); }
排序查詢
//以整型屬性排序:createQuery("from 類名 order by 屬性 desc ") Query query = session.createQuery("from Course order by course_id desc "); List<Course> courses = query.list(); for (Course c : courses) { System.out.println(c); }
條件查詢
//createQuery("from 映射類 where course_id=:代名 and course_name=:代名 ") //query.setParameter("代名",值); Query query = session.createQuery("from Course where course_id=:a and course_name=:b "); query.setParameter("a",1); query.setParameter("b","語文"); List<Course> courses = query.list(); for (Course c : courses) { System.out.println(c); }
投影查詢
//createQuery("select 類名(別稱).屬性 from 類名 (別稱)") Query query = session.createQuery("select c.course_id from Course c"); List<Object> courses = query.list(); for (Object c : courses) { System.out.println(c); }
分頁查詢
//createQuery("from Course") //setFirstResult(行號) //setMaxResult(條數) //行號從零開始 Query query = session.createQuery("from Course"); query.setFirstResult(1); query.setMaxResults(2); List<Object> courses = query.list(); for (Object c : courses) { System.out.println(c); }
統計查詢
//count() //單個結果uniqueResult() Query query = session.createQuery("select count(*) from Course"); Object o = query.uniqueResult(); System.out.println(o);
分組查詢
Query query = session.createQuery("select stu_age,count(*) from Student group by stu_age"); List<Object[]> list = query.list(); for(Object[] o : list){ System.out.println(Arrays.toString(o)); }
多表查詢-普通內連接
//createQuery("from 類名 別名 inner join 別名.關聯屬性") //left join、right join //查完得到集合每個元素兩個對象 Query query = session.createQuery("from Student s inner join s.stu_class"); List<Object[]> list = query.list(); for(Object[] o : list){ System.out.println(Arrays.toString(o)); }
多表查詢-迫切內連接
//createQuery("from 類名 別名 inner join fetch 別名.關聯屬性") //得到另外一個表對象封裝在這個表的關聯屬性中,集合元素就是此類對象 Query query = session.createQuery("from Student s inner join fetch s.stu_class"); List<Object[]> list = query.list(); for(Object[] o : list){ System.out.println(Arrays.toString(o)); }
03
QBC方式
什麼是QBC?
Query By Criteria,條件查詢。是一種更加面向對象化的查詢的方式因此比起HQL更加的方便。
簡單查詢
//createCriteria(類名.class) Criteria criteria = session.createCriteria(Course.class); List<Course> list = criteria.list(); for(Course c : list){ System.out.println(c); }
分頁查詢
//criteria.setFirstResult(行號); //criteria.setMaxResults(條數); Criteria criteria = session.createCriteria(Course.class); criteria.setFirstResult(0); criteria.setMaxResults(2); List<Course> list = criteria.list(); for(Course c : list){ System.out.println(c); }
排序查詢
//criteria.addOrder(Order.desc("屬性名")) Criteria criteria = session.createCriteria(Course.class); criteria.addOrder(Order.desc("course_id")); List<Course> list = criteria.list(); for(Course c : list){ System.out.println(c); }
條件查詢
符號 |
表達方法 |
---|---|
= |
eq |
> |
gt |
>= |
ge |
< |
lt |
<= |
le |
<> |
ne |
like |
like |
in |
in |
or |
or |
and |
and |
//Restrictions.eq("屬性名",值) Criteria criteria = session.createCriteria(Course.class); criteria.add(Restrictions.eq("course_id",1)); List<Course> list = criteria.list(); for(Course c : list){ System.out.println(c); }
Criteria criteria = session.createCriteria(Course.class); criteria.add(Restrictions.or(Restrictions.eq("course_id",1),Restrictions.like("course_name","語%"))); List<Course> list = criteria.list(); for(Course c : list){ System.out.println(c); }
統計查詢
//setProjection(Projections.rowCount()) Criteria criteria = session.createCriteria(Course.class); criteria.setProjection(Projections.rowCount()); Object o = criteria.uniqueResult(); System.out.println(o);
離線條件查詢
脫離Session,添加條件
可以在外部提前使用DetachedCriteria對象提交設置好條件
最後再綁定到session當中
public void lxTest(){ Session session = HibernateUtil.openSession(); DetachedCriteria dc = DetachedCriteria.forClass(Course.class); dc.add(Restrictions.like("course_name","語%")); //之前都是直接用session得到查詢對象再操作 //現在可以先寫完最後添加到session進行會話 Criteria c = dc.getExecutableCriteria(session); List<Course> list = c.list(); }