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()); } }