hibernate(八)HQL(2)
阿新 • • 發佈:2018-12-19
BaseDAO需求
- 作用:
- 1、將賦值的操作交給basedao
- 2、分頁 a、查詢出符合條件的總記錄數 b、查詢符合條件的某一頁記錄
package com.zking.eight.dao; import java.util.Collection; import java.util.List; import java.util.Map; import org.hibernate.Session; import org.hibernate.query.Query; import com.zking.eight.util.PageBean; /** * 作用: * 1、將賦值的操作交給basedao * 2、分頁 * a、查詢出符合條件的總記錄數 * b、查詢符合條件的某一頁記錄 * @author Administrator * */ public class BaseDao { /** * 賦值的操作 * @param query 預定義物件 * @param map 前臺傳遞過來的引數 */ public void setParameter(Query query,Map<String, Object> map) { // query.setParameter("bookname", "%"+book.getBookname()+"%"); if(map == null || map.size()==0) { return; } Object values = null; for (Map.Entry<String, Object> entry : map.entrySet()) { values = entry.getValue(); if(values instanceof Collection) { query.setParameterList(entry.getKey(), (Collection) values); } else if(values instanceof Object[]) { query.setParameterList(entry.getKey(), (Object[]) values); } else { query.setParameter(entry.getKey(), values); } } } /** * 思路: * 擷取from後的sql語句,前面拼接select count(*) * * 轉成大寫 */ //查詢出符合條件的總記錄數 public String getCountHql(String hql) { int index = hql.toUpperCase().indexOf("FROM"); return "select count(*)"+hql.substring(index); } public List executeQuery(Session session, String hql,PageBean pageBean,Map<String, Object> map) { if( pageBean != null && pageBean.isPagination()) { String countHql = getCountHql(hql); Query countQuery = session.createQuery(countHql); this.setParameter(countQuery, map); //pagebean設定總記錄數,最後用於分頁 pageBean.setTotal(countQuery.getSingleResult().toString()); //查詢展示的資料 Query pageQuery = session.createQuery(hql); this.setParameter(pageQuery, map); pageQuery.setFetchSize(pageBean.getStartIndex()); pageQuery.setMaxResults(pageBean.getRows()); return pageQuery.list(); } else { Query query = session.createQuery(hql); this.setParameter(query, map); return query.list(); } } }
dao方法: 沒有BaseDao方法:
public List<Book> list1(Book book,PageBean pageBean){ Session session = SessionFactoryUtils.getSession(); Transaction transaction = session.beginTransaction(); String hql = "from Book where 1=1"; if(StringUtils.isNotBlank(book.getBookname())) { hql += " and bookname like :bookname "; } Query query = session.createQuery(hql); if(StringUtils.isNotBlank(book.getBookname())) { query.setParameter("bookname", "%"+book.getBookname()+"%"); } if( pageBean != null && pageBean.isPagination()) { query.setFirstResult(pageBean.getStartIndex()); query.setMaxResults(pageBean.getRows()); } List list = query.list(); transaction.commit(); session.close(); return list; }
繼承BaseDao方法:
public List<Book> list2(Book book,PageBean pageBean){ Session session = SessionFactoryUtils.getSession(); Transaction transaction = session.beginTransaction(); Map<String, Object> map = new HashMap<>(); String hql = "from Book where 1=1"; if(StringUtils.isNotBlank(book.getBookname())) { hql += " and bookname like :bookname "; map.put("bookname", book.getBookname()); } List list = super.executeQuery(session, hql, pageBean, map); transaction.commit(); session.close(); return list; }
原生態SQL
hql實現不了的功能,可以考慮使用原生sql,例如: 1、多表(5+)聯查 2、未配置對映檔案中關係
public List<Object[]> list3(Book book,PageBean pageBean){
Session session = SessionFactoryUtils.getSession();
Transaction transaction = session.beginTransaction();
Map<String, Object> map = new HashMap<>();
// String hql = " select b.bookname,o.orderId from Book b,Order o where 1=1";
// List list = session.createQuery(hql).list();
//原生態SQL
String sql = " select b.book_name,o.order_id from t_hibernate_book b,t_hibernate_order o where 1=1";
List list = session.createSQLQuery(sql).list();
transaction.commit();
session.close();
return list;
}
檢視對映
hibernate支援檢視對映
public List<Object[]> list3(Book book,PageBean pageBean){
Session session = SessionFactoryUtils.getSession();
Transaction transaction = session.beginTransaction();
Map<String, Object> map = new HashMap<>();
//檢視對映
String sql = " select * from book_order";
List list = session.createSQLQuery(sql).list();
transaction.commit();
session.close();
return list;
}