轉載:http://blog.csdn.net/iijse/article/details/6161143
通常使用的Hibernate通常是三種:hql查詢,QBC查詢和QBE查詢:
1、QBE(Qurey By Example)檢索方式
QBE是最簡單的,但是功能也是最弱的,QBE的功能不是特別強大,僅在某些場合下有用。一個典型的使用場合就是在查詢窗口中讓用戶輸入一系列的 查詢條件,然后返回匹配的對象。QBE只支持=和like比較運算符,無法不大區間值,及其或的匹配。在這種情況下,還是采用HQL檢索方式或QBC檢索 方式。
示例:
1: Session session = SessionFactory.getCurrentSession();
2: User user = null;
3: Transaction ts = session.beginTransaction();
4: try {
5: Query query = session.createQuery("from User as u where name='ijse'");
6: user= (User) query.list().get(0);
7: session.commit();
8: } catch (HibernateException ex) {
9: ts.rollBack();
10: ex.printStackTrace();
11: }
12: System.out.println(user.getName());
QBC(Query By Criteria) 查詢方式
這種方式比較面向對象方式,重點是有三個描述條件的對象:Restrictions,Order,Projections。使用QBC查詢,一般需要以下三個步驟:
- 使用Session實例 的createCriteria()方法創建Criteria對象
- 使用工具類Restrictions的方法為Criteria對象設置查詢條件,Order工具類的方法設置排序方式,Projections工具類的方法進行統計和分組。
- 使用Criteria對象的list()方法進行查詢並返回結果
Restrictions類的常用方法:
Order類的常用方法:
方法名稱 |
描述 |
Order.asc | 升序 |
Order.desc | 降序 |
Projections類的常用方法
示例:
1: Session session = SessionFactory.getCurrentSession();
2: User user = null;
3: Transaction ts = session.beginTransaction();
4: try {
5: Criteria criteria = session.createCriteria(User.class);
6: criteria.add(Restrictions.eq("name","ijse"));
7: user= (User) criteria.list().get(0);
8: session.commit();
9: } catch (HibernateException ex) {
10: ts.rollBack();
11: ex.printStackTrace();
12: }
13: System.out.println(user.getName());
QBE(Query By Example)查詢方式
將一個對象的非空屬性作為查詢條件進行查詢。
示例:
1: Session session = SessionFactory.getCurrentSession();
2: User user = new User();
3: user.setName("ijse");
4: Transaction ts = session.beginTransaction();
5: try {
6: Criteria criteria = session.createCriteria(User.class);
7: criteria.add(Example.create(user));
8: user= (User) criteria.list().get(0);
9: session.commit();
10: } catch (HibernateException ex) {
11: ts.rollBack();
12: ex.printStackTrace();
13: }
14: System.out.println(user.getName());
離線查詢
離線查詢就是建立一個DetachedCriteria對象,將查詢的條件等指定好,然后在session.beginTransaction()后將這個對象傳入。通常這個對象可以在表示層建立,然后傳入業務層進行查詢。
示例:
1: DetachedCriteria detachedCriteria = DetachedCriteria.forClass(User.class);
2: detachedCriteria.add(Restrictions.eq("name","ijse");
3:
4: Session session = SessionFactory.getCurrentSession();
5: User user = new User();
6: Transaction ts = session.beginTransaction();
7: try {
8: Criteria criteria = detachedCriteria.getExecutableCriteria(session);
9: user= (User) criteria.list().get(0);
10: session.commit();
11: } catch (HibernateException ex) {
12: ts.rollBack();
13: ex.printStackTrace();
14: }
15: System.out.println(user.getName());
復合查詢
復合查詢就是在原有查詢的基礎上再進行查詢,可以調用Criteria對象的createCriteria()方法在這個Criteria對象的基礎上再進行查詢。
示例:
1: Session session = SessionFactory.getCurrentSession();
2: User user = new
3: User();
4: Transaction ts = session.beginTransaction();
5: try
6: {
7: Criteria criteria1 =
8: session.createCriteria(Room.class);
9: Criteria
10: criteria2 =criterial1.createCriteria("User");
11:
12: criteria2.add(Restrictions.eq("name",new String("ijse"));
13:
14: user= (User) criteria.list().get(0);
15:
16: session.commit();
17: } catch (HibernateException ex) {
18:
19: ts.rollBack();
20:
21: ex.printStackTrace();
22: }
23: System.out.println(user.getName());
分頁查詢
分頁查詢主要是要指定兩個參數:從第幾條數據開始,取多少條數據。可以通過調用Query或者Criteria對象的setFirstResult()和setMaxResults()方法分別進行設定。
示例:
1: Session session = SessionFactory.getCurrentSession();
2: List userList = null;
3: Transaction ts = session.beginTransaction();
4: try {
5: Criteria criteria = session.createCriteria(User.class);
6: criteria.setFirstResult(0);//從第一個數據開始
7: criteria.setMaxResults(10);//取10條記錄
8: userList = (List) criterial.list();
9: session.commit();
10: } catch (HibernateException ex) {
11: ts.rollBack();
12: ex.printStackTrace();
13: }