Hibernate5.2之原生SQL查詢


                                                                                                                                       Hibernate5.2之原生SQL查詢

一. 介紹

   在上一篇博客中筆者通過代碼的形式給各位讀者介紹了Hibernate中最重要的檢索方式--HQL查詢。在本博文中筆者將向各位讀者介紹Hibernate中的原生SQL查詢,雖為原生SQL查詢,但是筆者認為Hibernate在針對不同的數據庫在分頁語句的處理上做的很不錯,我們不用去關心使用的是何種的數據庫。本博文會沿用《Hibernate5.2之HQL查詢》中的POJO類和配置文件,請各位看官在閱讀本博文之前請先閱讀該文章,本篇文章會將HQL中涉及的相關操作原封不動的全部改為SQL查詢,所以在代碼上的重復度比較的高,請各位讀者勿噴,那我們就直接上單元測試了。

二. 單元測試

A.獲取所有的Order對象,得到一個List集合

@Test
public void list(){
    String sql = "select * from orders";
    NativeQuery<Order> query = session.createNativeQuery(sql, Order.class);
    List<Order> list = query.getResultList();
    for(Order o : list){
         System.out.println(o.getId() + "::" + o.getOrderId());
    }
}

B.獲取Order的分頁數據,得到一個List集合

/**
 * 雖然為原生的SQL查詢,但是依然可以使用setFirstResult()和setMaxResults()方法。從而屏蔽了
 * 底層數據庫的差異性。
 */
@Test
public void pageList(){
    String sql = "select * from orders";
    //setFirstResult()從0開始
    Query<Order> query = session.createNativeQuery(sql, Order.class).setFirstResult(1).setMaxResults(4);
    List<Order> list = query.getResultList();
    for(Order o : list){
         System.out.println(o.getId());
    }
}

C.多條件查詢,返回List集合(第一種形式:索引占位符)

@Test
public void multiCretiera(){
    String sql = "select * from orders where create_time between ? and ? and order_id like ?";
    Query<Order> query = session.createNativeQuery(sql, Order.class);
    String beginDateStr = "2016-07-26 00:00:00";
    String endDateStr = "2016-07-28 23:59:59";
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    Date beginDate = null;
    Date endDate = null;
    try {
         beginDate = sdf.parse(beginDateStr);
         endDate = sdf.parse(endDateStr);
    } catch (ParseException e) {
         e.printStackTrace();
    }
    //分頁從0開始
    query.setParameter(0, beginDate).setParameter(1, endDate).setParameter(2, "%D%").setFirstResult(0).setMaxResults(1);
    List<Order> list = query.getResultList();
    for(Order o : list){
         System.out.println(o.getOrderId() + "::" + o.getCreateTime());
    }
}

D.多條件查詢,返回List集合(第二種形式:命名占位符)

@Test
public void multiCretiera1(){
    String sql = "select * from orders where order_id like :orderId and create_time between :beginDate and :endDate";
    Query<Order> query = session.createNativeQuery(sql, Order.class);
    String beginDateStr = "2016-07-26 00:00:00";
    String endDateStr = "2016-07-28 23:59:59";
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    Date beginDate = null;
    Date endDate = null;
    try {
         beginDate = sdf.parse(beginDateStr);
         endDate = sdf.parse(endDateStr);
    } catch (ParseException e) {
         e.printStackTrace();
    }
    query.setParameter("orderId", "%D%").setParameter("beginDate", beginDate).setParameter("endDate", endDate);
    List<Order> list = query.getResultList();
    for(Order o : list){
         System.out.println(o.getId() + "::" + o.getOrderId());
    }
}

E.大於條件的查詢,使用索引占位符

@Test
public void gt(){
    String sql = "select * from orders where id > ?";
    Query<Order> query = session.createNativeQuery(sql, Order.class).setParameter(0, 3);
    List<Order> list = query.getResultList();
    for(Order o : list){
        System.out.println(o.getId() + "::" + o.getOrderId());
    }
}

F.刪除操作

@Test
public void delete(){
    String sql = "delete from orders where id in (:idList)"; 
    Transaction tx = session.beginTransaction();
    List<Integer> list = new ArrayList<Integer>();
    list.add(1);
    list.add(2);
    Query<?> query = session.createNativeQuery(sql).setParameter("idList", list);
    int i = query.executeUpdate();
    System.out.println(i);
    tx.commit();
    session.close();
}

G.獲取某一列的值

@Test
public void singleValue(){
    String sql = "select order_id from orders";
    Query<String> query = session.createNativeQuery(sql);
    List<String> list = query.getResultList();
    for(String str : list){
        System.out.println(str);
    }
}

 H.獲取關聯對象的結果集

@Test
public void getCustomer(){
    String sql = "select c.* from orders o join customer c on o.customer_id = c.id where c.id = 8";
    Query<Customer> query = session.createNativeQuery(sql, Customer.class);
    List<Customer> list = query.getResultList();
    for(Customer o : list){
        System.out.println(o.getId() + ";;");
    }
}

 I.多列數據的查詢

@Test
public void getObjectArray(){
    String sql = "select c.name, c.phone_number, o.order_id, o.create_time from orders o join customer c on o.customer_id = c.id";
    Query<Object[]> query = session.createNativeQuery(sql);
    List<Object[]> list = query.getResultList();
    for(Object[] o : list){
         System.out.println(o[0] + ";;" + o[1] + ";;" + o[2]);
    }
}

J.函數查詢

@Test
public void functionQuery(){
    String sql = "select max(id), count(*) from orders";
    Query<Object[]> query = session.createNativeQuery(sql);
    Object[] obj = query.getSingleResult();
    System.out.println(obj[0] + "::" + obj[1]);
}

 K.排序

@Test
public void descQuery(){
    String sql = "select * from orders order by id desc";
    Query<Order> query = session.createNativeQuery(sql, Order.class);
    List<Order> list = query.getResultList();
    for(Order o : list){
        System.out.println(o.getId() + "::" + o.getOrderId());
    }
}

L.右連接

@Test
public void rightJoin(){
    String sql = "select c.* from orders o right join customer c on o.customer_id = c.id";
    Query<Customer> query = session.createNativeQuery(sql, Customer.class);
    List<Customer> list = query.getResultList();
    for(Customer c : list){
        System.out.println(c.getId());
    }
}

 

上一篇:Hibernate5.2之HQL查詢


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM