天天看點

Hibernate HQL和QBC

OID查詢

一、什麼是OID查詢

根據對象的OID主鍵進行檢索

二、OID查詢方式

1. get方法
  • 當get()方法被調用的時候就會立即發出SQL語句
  • 并且傳回的對象也是實際的對象
  • 使用get()和普通的單條查詢并沒有多大的差別
  • 當查詢不到的時候get()傳回的是null
Session currentSession = HibernateUtil.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
User user = currentSession.get(User.class, 1L);
System.out.println(user);
transaction.commit();                
2. load方法
  • 當調用load()方法的時候會傳回一個目标對象的代理對象
  • 在這個代理對象中隻存儲了目标對象的ID值
  • 隻有當調用除ID值以外的屬性值的時候才會發出SQL查詢的
  • 當使用到除ID以外的屬性的時候,會發出SQL查詢語句
  • 當查詢不到的時候load()報錯 ObjectNotFoundException
Session currentSession = HibernateUtil.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
User user = currentSession.load(User.class, 1L);
System.out.println(user.getUser_id());
System.out.println(user.getUser_name());
transaction.commit();                

對象導航查詢

Hibernate根據一個已經查詢到的對象,獲得其關聯的對象的一種查詢方式。先查詢到聯系人,就可以通過聯系人擷取聯系人所關聯的客戶對象。

HQL

一、什麼是HQL

HQL查詢:Hibernate Query Language,Hibernate的查詢語言

    • 是一種面向對象的方式的查詢語言,文法類似SQL。
  • 通過session.createQuery(),用于接收一個HQL進行查詢方式。

二、查詢

1. 簡單查詢

  • 注意:HQL當中不支援 * 的寫法。是以 select * from 類名 是錯誤的。
  • createQuery("from 類名");
@Test
public void test(){
    Session session = HibernateUtil.openSession();
    Query query = session.createQuery("from User");
    List<User> list = query.list();
    for (User user : list) {
        System.out.println(user);
    } 
}                

2. 别名查詢

  • 注意:HQL當中不支援 * 的寫法。是以 select * from 類名 是錯誤的。
  • createQuery("from 類名 别名");
@Test
public void test2(){
    Session session = HibernateUtil.openSession();
    Query query = session.createQuery("select c from User c");
    List<User> list = query.list();
    for (User user : list) {
        System.out.println(user);
    }
}                

3. 排序查詢

  • order by 字段 desc/asc
@Test
public void test3(){
    Session session = HibernateUtil.openSession();
    Query query = session.createQuery("select c from User c order by user_id desc");
    List<User> list = query.list();
    for (User user : list) {
        System.out.println(user);
    }
}                

4. 條件查詢

(1)位置綁定

根據參數的位置進行綁定條件(不常用)

@Test
public void test4() {
    Session session = HibernateUtil.openSession();
    // Query query = session.createQuery("from User where user_code=? and user_name=?");
    Query query = session.createQuery("from User where user_code=?0 and user_name=?1");
    query.setParameter(0, "user1");
    query.setParameter(1, "IT666");
    List<User> list = query.list();
    for (User user : list) {
        System.out.println(user);
    }
}                
(2)名稱綁定

把參數對應的值起一個名稱 再去設定名稱

@Test
public void test5() {
    Session session = HibernateUtil.openSession();
    Query query = session.createQuery("from User where user_code=:a and user_name=:b");
    query.setParameter("a", "user1");
    query.setParameter("b", "IT666");
    List<User> list = query.list();
    for (User user : list) {
        System.out.println(user);
    }
}                

5. 投影查詢

  • 查詢對象的某個或某些屬性
(1)單個屬性
@Test
public void test5() {
    Session session = HibernateUtil.openSession();
    Query query = session.createQuery("select c.user_name from User c");
    List<Object> list = query.list();
    for (Object o : list) {
        System.out.println(o);
    }
}                
(2)多個屬性
@Test
public void test6() {
    Session session = HibernateUtil.openSession();
    Query query = session.createQuery("select c.user_code,c.user_name from User c");
    List<Object[]> list = query.list();
    for (Object[] o : list) {
        System.out.println(Arrays.toString(o));
    }
}                
(3)查詢多個屬性,封裝到對象當中,要在類中,提供構造方法
// 提供有參構造器時,盡量也寫上無參構造器
public User() {}
    
public User(String user_code, String user_name) {
    this.user_code = user_code;
    this.user_name = user_name;
}                
@Test
public void test7() {
    Session session = HibernateUtil.openSession();
    Query query = session.createQuery("select new User(user_code,user_name) from User c");
    List<User> list = query.list();
    for (User user : list) {
        System.out.println(user);
    }
}                

6. 分頁查詢

@Test
public void test8() {
    Session session = HibernateUtil.openSession();
    Query query = session.createQuery("from User");
    query.setFirstResult(0);    // 角标開始位置
    query.setMaxResults(2);     // 一次查的條數
    List<User> list = query.list();
    for (User user : list) {
        System.out.println(user);
    }
}                

7. 統計查詢

(1)查詢的結構隻有一個
@Test
public void test9() {
    Session session = HibernateUtil.openSession();
    Query query = session.createQuery("select count(*) from User");
    Object result = query.uniqueResult();
    System.out.println(result);
}                
(2)分組查詢
@Test
public void test10() {
    Session session = HibernateUtil.openSession();
    Query query = session.createQuery("select user_code,count(*) from User group by user_code");
    List<Object[]> list = query.list();
    for (Object[] o : list) {
        System.out.println(Arrays.toString(o));
    }
}                

8. 多表查詢

(1)普通内連接配接
@Test
public void test11() {
    Session session = HibernateUtil.openSession();
    Query query = session.createQuery("from User u inner join u.roles");
    List<Object[]> list = query.list();
    for (Object[] o : list) {
        System.out.println(Arrays.toString(o));
    }
}                
(2)迫切内連接配接

在普通内連接配接inner join 後添加一個關鍵字fetch,通過hibernate将另一個對象的資料,封裝該對象中

@Test
public void test12() {
    Session session = HibernateUtil.openSession();
    Query query = session.createQuery("from User u inner join fetch u.roles");
    List<User> list = query.list();
    for (User user : list) {
        System.out.println(user);
    }
}                

QBC

一、什麼是QBC

Query By Criteria,條件查詢。是一種更加面向對象化的查詢的方式。

二、查詢

1. 簡單查詢

@Test
public void test() {
    Session session = HibernateUtil.openSession();
    Criteria criteria = session.createCriteria(User.class);
    List<User> list = criteria.list();
    for (User user : list) {
        System.out.println(user);
    }
}                

2.排序查詢

@Test
public void test2() {
    Session session = HibernateUtil.openSession();
    Criteria criteria = session.createCriteria(User.class);
    // 添加排序
    criteria.addOrder(Order.desc("user_id"));
    List<User> list = criteria.list();
    for (User user : list) {
        System.out.println(user);
    }
}                

3.分頁查詢

@Test
    public void test3() {
        Session session = HibernateUtil.openSession();
        Criteria criteria = session.createCriteria(User.class);
        // 添加排序
        criteria.addOrder(Order.desc("user_id"));
        // 分頁
        criteria.setFirstResult(0);
        criteria.setMaxResults(2);
        List<User> list = criteria.list();
        for (User user : list) {
            System.out.println(user);
        }
    }                

4.條件查詢

條件
=     eq
>    gt
>=   ge
<    lt
<=   le
<>   ne
like
in
and
or
           
單個條件
@Test
public void test4() {
    Session session = HibernateUtil.openSession();
    Criteria criteria = session.createCriteria(User.class);
    // 添加條件
    criteria.add(Restrictions.eq("user_code", "user2"));
    List<User> list = criteria.list();
    for (User user : list) {
        System.out.println(user);
    }
}                
多個條件
@Test
public void test5() {
    Session session = HibernateUtil.openSession();
    Criteria criteria = session.createCriteria(User.class);
    // 多條件
    criteria.add(Restrictions.eq("user_code", "user2"));
    criteria.add(Restrictions.like("user_name", "%888"));
    List<User> list = criteria.list();
    for (User user : list) {
        System.out.println(user);
    }
}                
統計查詢
Hibernate HQL和QBC
@Test
public void test6() {
    Session session = HibernateUtil.openSession();
    Criteria criteria = session.createCriteria(User.class);
    // 統計查詢 隻有一個結果
    criteria.setProjection(Projections.rowCount());
    Object result = criteria.uniqueResult();
    System.out.println(result);
}                
離線條件查詢
  • 脫離Session,添加條件
  • 可以在外部提前使用DetachedCriteria對象送出設定好條件
  • 最後再綁定到session當中
@Test
public void test7() {
    DetachedCriteria Criteria = DetachedCriteria.forClass(User.class);
    Criteria.add(Restrictions.like("user_name", "%888"));

    Session session = HibernateUtil.openSession();
    Criteria executableCriteria = Criteria.getExecutableCriteria(session);
    List<User> list = executableCriteria.list();

    for (User user : list) {
        System.out.println(user);
    }
}                

轉載于:https://www.cnblogs.com/xzh0717/p/10813027.html