一個數據庫查詢方法(可以動態設定查詢引數,設定查詢條件),很巧妙的組合sql語句
public <T> QueryResult<T> getScrollData(Class<T> entityClass,String wherejpql,Object[] queryParams,
int firstindex, int maxResult, LinkedHashMap<String, String> orderby) {
// for(int i = 0;i<queryParams.length;i++){
// System.out.println("=================queryParams is " + i +queryParams[i]);
// }
String entityName = getEntityName(entityClass);
QueryResult qr = new QueryResult<T>();
Query query = em.createQuery(sql);
setQueryParams(query,queryParams);
System.out.println("-------------------in DaoSupport :sql is:" + sql);
/**
* 1:查詢的時候第一步查詢到的都是資料表裡所有的記錄
* 2:再用query.setFirstResult(firstindex).setMaxResults(maxResult)
* 方法來設定要顯示的首記錄(即從哪一條開始顯示)和要顯示的記錄條數
* 3:然後儲存相關資料,方便前臺頁面顯示
*/
if(firstindex != -1 && maxResult != -1){
query.setFirstResult(firstindex).setMaxResults(maxResult);
}
qr.setResultList(query.getResultList());
/**
* 這裡的記錄數不是要顯示的記錄有多少條,而是資料表裡一共有多少條記錄
*/
query = em.createQuery("select count(o) from "+entityName+" o " + (wherejpql==null?"":"where " + wherejpql));
setQueryParams(query,queryParams);
qr.setTotalrecord((Long)query.getSingleResult());
return qr;
}
/**
* 構建order by 語句
* orderby 語句格式:order by key1 asc,key2 asc
* @param orderby
* @return
*/
protected String buildOrderby(LinkedHashMap<String, String> orderby){
StringBuffer orderbySql = new StringBuffer("");
if(orderby !=null && orderby.size()>0){
orderbySql.append(" order by ");
//order by key1 desc,key2 asc
for(String key:orderby.keySet()){
orderbySql.append(key).append(" ").append(orderby.get(key)).append(",");
}
orderbySql.deleteCharAt(orderbySql.length() - 1);
}
return orderbySql.toString();
}
/**
* 給where語句設定引數值
* wherejpql 語句格式:where o.property=?1,o.property=?2。
* @param query
* @param params
*/
protected void setQueryParams(Query query,Object[] params){
if(params != null && params.length > 0){
for(int i=0;i<params.length;i++){
//System.out.println("i+1 = " + (i+1) + " params[i] " + params[i] );
query.setParameter(i+1, params[i]);
}
}
}
QueryResult.java:
package com.itcast.util;
import java.util.List;
public class QueryResult<T>{
private List<T> resultList;
private long totalrecord;
public List<T> getResultList() {
return resultList;
}
public void setResultList(List<T> resultList) {
this.resultList = resultList;
}
public long getTotalrecord() {
return totalrecord;
}
public void setTotalrecord(long totalrecord) {
this.totalrecord = totalrecord;
}
}