与hibernate的Critical类似,是一种通用的Dao层简单化查询通用方法,是我在13年刚接触hibernate的,因为当时的业务性质,需要频繁的简单查询,但我还不知Critical,所以编写了这么一套通用查询方法,思想应该与Critical是一致的
首先是service层,这个通用的service使得可以直接从action层传递参数,查询出相应的对象或集合
package com.donglusoft.select.service;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.donglusoft.select.DAO.SelectAllObjectDAO;
@Service("selectAllObjectService")
public class SelectAllObjectService {
@Resource
private SelectAllObjectDAO selectAllObjectDAO;
/**
* 通用查询方法一:《相等》《相似》《单,双时间段》条件查询通用方法,返回符合条件的List
* E表示equal相等,C表示close相似,T表示two双时间段
* @author liuyuqin
* @since 2013年11月26日16:48:16
* @param equalStringMap 例如new一个equalStringMap; equalStringMap.put("name", "张三"); —— 精确查询姓名叫张三的人
* @param closeStringMap 例如new一个closeStringMap; closeStringMap.put("name", "张"); —— 模糊查询姓张的人
* @param timeOne 例如 String[] timeOne = {"time","2013-08-12","2013-11-11"};
* @param timeTwo
* @param ob 查询条件的JavaBean对象
* @return
* Map 中的List 的关键字为 objectList 取值为: map.get("objectList");
* Map 中的count 的关键字为 count 取值为 map.get("count");
*/
public List selectListByE_C_T(Map<String , String> equalStringMap , Map<String , String> closeStringMap
,String[] timeOne ,String[] timeTwo, Object ob){
String className = ob.getClass().getName().substring(ob.getClass().getName().lastIndexOf(".")+1);
return selectAllObjectDAO.selectListByE_C_T(equalStringMap,closeStringMap,timeOne,timeTwo,className);
}
/**
* 通用查询方法二:《相等》《相似》《单,双时间段》条件查询通用方法,返回符合条件的Map,Map有对象集合和对象集合长度<"objectList","count">;
* E表示equal相等,C表示close相似,T表示two双时间段
* @author liuyuqin
* @since 2013年11月26日16:48:16
* @param equalStringMap 例如Map<String, String> equalStringMap = new HashMap<String, String>(); equalStringMap.put("name", "张三"); —— 精确查询姓名叫张三的人
* @param closeStringMap 例如Map<String, String> closeStringMap = new HashMap<String, String>(); closeStringMap.put("name", "张"); —— 模糊查询姓张的人
* @param timeOne 例如 String[] timeOne = {"time","2013-08-12","2013-11-11"};
* @param timeTwo
* @param ob 查询条件的JavaBean对象
* @return
* Map 中的List 的关键字为 objectList 取值为: map.get("objectList");
* Map 中的count 的关键字为 count 取值为 map.get("count");
*/
public Map<String , Object> selectMapByE_C_T(Map<String , String> equalStringMap , Map<String , String> closeStringMap
,String[] timeOne ,String[] timeTwo, Object ob){
String className = ob.getClass().getName().substring(ob.getClass().getName().lastIndexOf(".")+1);
List list = selectAllObjectDAO.selectListByE_C_T(equalStringMap,closeStringMap,timeOne,timeTwo,className);
long count = Long.valueOf(list.size());
Map<String , Object> map = new HashMap<String, Object>();
map.put("objectList", list);
map.put("count", count);
return map;
}
/**
* 通用查询方法三:《相等》《相似》《单,双时间段》条件《分页》查询通用方法,返回符合条件的Map,Map有对象集合和对象集合长度<"objectList","count">;
* E表示equal相等,C表示close相似,T表示two双时间段
* @author liuyuqin
* @since 2013年11月26日16:48:16
* @param equalStringMap 例如Map<String, String> equalStringMap = new HashMap<String, String>(); equalStringMap.put("name", "张三"); —— 精确查询姓名叫张三的人
* @param closeStringMap 例如Map<String, String> closeStringMap = new HashMap<String, String>(); closeStringMap.put("name", "张"); —— 模糊查询姓张的人
* @param timeOne 例如 String[] timeOne = {"time","2013-08-12","2013-11-11"};
* @param timeTwo
* @param start 分页起始页码
* @param limit 分页每组显示数量
* @param ob 查询条件的JavaBean对象
* @return
* Map 中的List 的关键字为 objectList 取值为: map.get("objectList");
* Map 中的count 的关键字为 count 取值为 map.get("count");
*/
public Map<String , Object> selectPagingMapByE_C_T(Map<String , String> equalStringMap , Map<String , String> closeStringMap
,String[] timeOne ,String[] timeTwo, Object ob, int start,int limit){
String className = ob.getClass().getName().substring(ob.getClass().getName().lastIndexOf(".")+1);
Map<String , Object> map = selectAllObjectDAO.selectPagingMapByE_C_T(equalStringMap,closeStringMap,timeOne,timeTwo,className,start,limit);
return map;
}
/**
* 通用查询方法四:遍历可用的表记录,返回符合条件的Map,Map有对象集合和对象集合长度<"objectList","count">;
* @author liuyuqin
* @since 2013年11月29日14:49:29
* @param ob 查询条件的JavaBean对象
* @return
* Map 中的List 的关键字为 objectList 取值为: map.get("objectList");
* Map 中的count 的关键字为 count 取值为 map.get("count");
*/
public Map<String , Object> queryObjectMap(Object ob){
String className = ob.getClass().getName().substring(ob.getClass().getName().lastIndexOf(".")+1);
List list = selectAllObjectDAO.queryObjectMap(className);
long count = Long.valueOf(list.size());
Map<String , Object> map = new HashMap<String, Object>();
map.put("objectList", list);
map.put("count", count);
return map;
}
/**
* 通用查询方法五:《分页》遍历可用的表记录,返回符合条件的Map,Map有对象集合和对象集合长度<"objectList","count">;
* @author liuyuqin
* @since 2013年11月29日14:49:29
* @param ob 查询条件的JavaBean对象
* @return
* Map 中的List 的关键字为 objectList 取值为: map.get("objectList");
* Map 中的count 的关键字为 count 取值为 map.get("count");
*/
public Map<String , Object> queryPagingObjectMap(Object ob,int start,int limit){
String className = ob.getClass().getName().substring(ob.getClass().getName().lastIndexOf(".")+1);
Map<String , Object> map = selectAllObjectDAO.queryPagingObjectMap(className,start,limit);
return map;
}
/**
* 通用查询方法六:根据特定对象Id找到相应对象,此方法适用于不需要持久态的对象,如果需要持久化对象,请用相关DAO层中的findById方法
* @author liuyuqin
* @since 2013年3月14日12:45:12
* @param ob 查询条件的JavaBean对象
* @return
*/
public Object findById(Object ob) throws Exception{
String className = ob.getClass().getName().substring(ob.getClass().getName().lastIndexOf(".")+1);
Class b = ob.getClass();
Method rAge = b.getMethod("getId");
String dictionaryObjectId = (String) rAge.invoke(ob);
return selectAllObjectDAO.findById(dictionaryObjectId,className);
}
/**
* 通用查询方法七:根据特定对象name找到相应对象
* @author liuyuqin
* @since 2013年11月26日15:04:22
* @param ob 查询条件的JavaBean对象
* @return
*/
public Object findByName(Object ob) throws Exception{
String className = ob.getClass().getName().substring(ob.getClass().getName().lastIndexOf(".")+1);
Class b = ob.getClass();
Method rAge = b.getMethod("getName");
String dictionaryObjectName = (String) rAge.invoke(ob);
return selectAllObjectDAO.findByName(dictionaryObjectName,className);
}
/**
* 通用查询方法八:《相等(字符串比较)》《相等(数字比较)》《相似》《单,双时间段》条件《分页》查询通用方法,返回符合条件的Map,Map有对象集合和对象集合长度<"objectList","count">;
* E表示equal相等,C表示close相似,T表示two双时间段
* @author liuyuqin
* @since 2013年11月26日16:48:16
* @param equalStringMap 例如Map<String, String> equalStringMap = new HashMap<String, String>(); equalStringMap.put("name", "张三"); —— 精确查询姓名叫张三的人
* @param equalIntMap 例如Map<String, Integer> equalIntMap = new HashMap<String, Integer>(); equalIntMap.put("flag", 10); —— 精确flag等于10的记录
* @param closeStringMap 例如Map<String, String> closeStringMap = new HashMap<String, String>(); closeStringMap.put("name", "张"); —— 模糊查询姓张的人
* @param timeOne 例如 String[] timeOne = {"time","2013-08-12","2013-11-11"};
* @param timeTwo
* @param start 分页起始页码
* @param limit 分页每组显示数量
* @param ob 查询条件的JavaBean对象
* @return
* Map 中的List 的关键字为 objectList 取值为: map.get("objectList");
* Map 中的count 的关键字为 count 取值为 map.get("count");
*/
public Map<String , Object> selectPagingMapByE_E_C_T(Map<String , String> equalStringMap ,
Map<String , Integer> equalIntMap ,Map<String , String> closeStringMap
,String[] timeOne ,String[] timeTwo, Object ob, int start,int limit){
String className = ob.getClass().getName().substring(ob.getClass().getName().lastIndexOf(".")+1);
Map<String , Object> map = selectAllObjectDAO.selectPagingMapByE_E_C_T(equalStringMap,equalIntMap,closeStringMap,timeOne,timeTwo,className,start,limit);
return map;
}
/**
* 通用查询方法九:《相等(字符串比较)》《相等(数字比较)》《相似》《单,双时间段》条件查询通用方法,返回符合条件的Map,Map有对象集合和对象集合长度<"objectList","count">;
* E表示equal相等,C表示close相似,T表示two双时间段
* @author liuyuqin
* @since 2013年11月26日16:48:16
* @param equalStringMap 例如Map<String, String> equalStringMap = new HashMap<String, String>(); equalStringMap.put("name", "张三"); —— 精确查询姓名叫张三的人
* @param equalIntMap 例如Map<String, Integer> equalIntMap = new HashMap<String, Integer>(); equalIntMap.put("flag", 10); —— 精确flag等于10的记录
* @param closeStringMap 例如Map<String, String> closeStringMap = new HashMap<String, String>(); closeStringMap.put("name", "张"); —— 模糊查询姓张的人
* @param timeOne 例如 String[] timeOne = {"time","2013-08-12","2013-11-11"};
* @param timeTwo
* @param start 分页起始页码
* @param limit 分页每组显示数量
* @param ob 查询条件的JavaBean对象
* @return
* Map 中的List 的关键字为 objectList 取值为: map.get("objectList");
* Map 中的count 的关键字为 count 取值为 map.get("count");
*/
public Map<String , Object> selectMapByE_E_C_T(Map<String , String> equalStringMap ,
Map<String , Integer> equalIntMap ,Map<String , String> closeStringMap
,String[] timeOne ,String[] timeTwo, Object ob, int start,int limit){
String className = ob.getClass().getName().substring(ob.getClass().getName().lastIndexOf(".")+1);
List list = selectAllObjectDAO.selectMapByE_E_C_T(equalStringMap,equalIntMap,closeStringMap,timeOne,timeTwo,className,start,limit);
long count = Long.valueOf(list.size());
Map<String , Object> map = new HashMap<String, Object>();
map.put("objectList", list);
map.put("count", count);
return map;
}
}
然后是核心的dao层
package com.donglusoft.select.DAO;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.springframework.stereotype.Repository;
import com.donglusoft.zzz.util.BaseHibernateDAO;
import com.donglusoft.zzz.util.SystemState;
/**
* A data access object (DAO) providing persistence and search support for Role
* entities. Transaction control of the save(), update() and delete() operations
* can directly support Spring container-managed transactions or they can be
* augmented to handle user-managed Spring transactions. Each of these methods
* provides additional information for how to configure it for the desired type
* of transaction control.
*
* @see com.donglusoft.rightmanagerment.domain.Role
* @author MyEclipse Persistence Tools
*/
@Repository("selectAllObjectDAO")
public class SelectAllObjectDAO extends BaseHibernateDAO {
/**********************自定义方法(↓)****************************/
/**
* 通过Id查找特定的对象
* @author liuyuqin
* @since 2013年3月9日10:59:10
*/
public Object findById(String dictionaryObjectId,String className){
try{
String queryString = "from " + className + " as t where t.delstate="+SystemState.USE+" and " +
"t.id=:dictionaryObjectId";
Query query = getSession().createQuery(queryString);
query.setString("dictionaryObjectId", dictionaryObjectId);
return query.uniqueResult();
} catch (HibernateException e) {
// TODO Auto-generated catch block
throw e;
}
}
/**
* 通过name查找特定的对象
* @author liuyuqin
* @since 2013年3月10日12:52:55
*/
public List<Object> findByName(String dictionaryObjectName,String className){
try{
String queryString = "from "+className +" as t where t.name =:name and t.delstate ="+SystemState.USE;
Query query = getSession().createQuery(queryString);
query.setString("name", dictionaryObjectName);
return query.list();
} catch (HibernateException e) {
// TODO Auto-generated catch block
throw e;
}
}
/**
* 《相等》《相似》《双时间段》条件查询通用方法,返回符合条件的List
* E表示equal相等,C表示close相似,T表示two双时间段
* @author liuyuqin
* @since 2013年11月26日16:48:16
* @param equalStringMap
* @param closeStringMap
* @param timeOne
* @param timeTwo
* @param className
* @return
*/
public List selectListByE_C_T(Map<String , String> equalStringMap , Map<String , String> closeStringMap
,String[] timeOne ,String[] timeTwo,String className){
String[] values = new String[8];
String[] keys = new String[8];
//创建数组插入标志位置
int valueNumber = 0;
int keyNumber = 0;
StringBuffer hQLString = new StringBuffer();
hQLString.append("from "+className+" as t where t.delstate = "+SystemState.USE);
//遍历查询条件及查询输入值的映射Map;特规定关键字为对象属性,值为对象属性输入值
//该equalStringMap装载等于值
if(equalStringMap!=null){
Iterator equalIt = equalStringMap.keySet().iterator();
//遍历每一个 相等条件 键值对
while(equalIt.hasNext()){
String perKey = (String)equalIt.next();
if(equalStringMap.get(perKey) != null && !(equalStringMap.get(perKey).equals(""))){
String perValue = (String)equalStringMap.get(perKey);
StringBuffer temp = new StringBuffer();
String[] args;
String simple;
if(perKey.contains(".")){
args = perKey.split("\\.");
for (int i = 0; i < args.length; i++) {
temp.append(args[i]);
}
simple = temp.toString();
}
else simple = perKey;
//拼接SQL语句来增加查询条件
hQLString.append(" and t."+perKey+" =:"+simple);
//将遍历出的每一个值添加到数组中
values[valueNumber] = perValue;
keys[keyNumber] = simple;
valueNumber++;
keyNumber++;
}//结束于equalIt的if
}
}
//遍历查询条件及查询输入值的映射Map;特规定关键字为对象属性,值为对象属性输入值
//该closeStringMap装载相似值的map
if(closeStringMap!=null){
Iterator closeIt = closeStringMap.keySet().iterator();
//遍历每一个 相似条件 键值对
while(closeIt.hasNext()){
String perKey = (String)closeIt.next();
if(closeStringMap.get(perKey) != null && !(closeStringMap.get(perKey).equals(""))){
String perValue = (String)closeStringMap.get(perKey);
StringBuffer temp = new StringBuffer();
String[] args;
String simple;
if(perKey.contains(".")){
args = perKey.split("\\.");
for (int i = 0; i < args.length; i++) {
temp.append(args[i]);
}
simple = temp.toString();
}
else simple = perKey;
//拼接SQL语句来增加查询条件
hQLString.append(" and t."+perKey +" like :"+simple);
//将遍历出的每一个值添加到数组中
values[valueNumber] = "%"+perValue+"%";
valueNumber++;
keys[keyNumber] = simple;
keyNumber++;
}//结束于closeIt的if
}
}
//时间段查询条件1
if( timeOne !=null && timeOne[0] != null){
hQLString.append(" and t."+timeOne[0] +" between '"+timeOne[1]+"' and '"+timeOne[2]+"'");
}
//时间段查询条件2
if(timeTwo !=null &&timeTwo[0] != null){
hQLString.append(" and t."+timeTwo[0] +" between '"+timeTwo[1]+"' and '"+timeTwo[2]+"'");
}
String hql = hQLString.toString();
Query query = getSession().createQuery(hql);
//遍历数组赋值给变量
for (int i = 0; i < values.length; i++) {
if(values[i]!=null){
query.setParameter(keys[i],values[i]);
}
}
return query.list();
}
/**
* 《相等》《相似》《双时间段》条件《分页》查询通用方法,返回符合条件的Map
* E表示equal相等,C表示close相似,T表示two双时间段
* @author liuyuqin
* @since 2013年11月29日11:26:11
* @param equalStringMap
* @param closeStringMap
* @param timeOne
* @param timeTwo
* @param className
* @param start
* @param limit
* @return
*/
public Map<String , Object> selectPagingMapByE_C_T(Map<String, String> equalStringMap , Map<String , String> closeStringMap
,String[] timeOne ,String[] timeTwo,String className,int start,int limit){
String[] values = new String[8];
String[] keys = new String[8];
//创建数组插入标志位置
int valueNumber = 0;
int keyNumber = 0;
StringBuffer hQLString = new StringBuffer();
StringBuffer countHQLString = new StringBuffer();
hQLString.append("from "+className+" as t where t.delstate = "+SystemState.USE);
countHQLString.append("select count(*) from "+className+" as t where t.delstate = "+SystemState.USE);
//遍历查询条件及查询输入值的映射Map;特规定关键字为对象属性,值为对象属性输入值
//该equalStringMap装载等于值
if(equalStringMap!=null){
Iterator equalIt = equalStringMap.keySet().iterator();
//遍历每一个 相等条件 键值对
while(equalIt.hasNext()){
String perKey = (String)equalIt.next();
if(equalStringMap.get(perKey) != null && !(equalStringMap.get(perKey).equals(""))){
String perValue = (String)equalStringMap.get(perKey);
StringBuffer temp = new StringBuffer();
String[] args;
String simple;
if(perKey.contains(".")){
args = perKey.split("\\.");
for (int i = 0; i < args.length; i++) {
temp.append(args[i]);
}
simple = temp.toString();
}
else simple = perKey;
//拼接SQL语句来增加查询条件
hQLString.append(" and t."+perKey+" =:"+simple);
countHQLString.append(" and t."+perKey+" =:"+simple);
//将遍历出的每一个值添加到数组中
values[valueNumber] = perValue;
keys[keyNumber] = simple;
valueNumber++;
keyNumber++;
}//结束于equalIt的if
}
}
//遍历查询条件及查询输入值的映射Map;特规定关键字为对象属性,值为对象属性输入值
//该closeStringMap装载相似值的map
if(closeStringMap!=null){
Iterator closeIt = closeStringMap.keySet().iterator();
//遍历每一个 相似条件 键值对
while(closeIt.hasNext()){
String perKey = (String)closeIt.next();
if(closeStringMap.get(perKey) != null && !(closeStringMap.get(perKey).equals(""))){
String perValue = (String)closeStringMap.get(perKey);
StringBuffer temp = new StringBuffer();
String[] args;
String simple;
if(perKey.contains(".")){
args = perKey.split("\\.");
for (int i = 0; i < args.length; i++) {
temp.append(args[i]);
}
simple = temp.toString();
}
else simple = perKey;
//拼接HQL语句来增加查询条件
hQLString.append(" and t."+perKey +" like :"+simple);
countHQLString.append(" and t."+perKey +" like :"+simple);
//将遍历出的每一个值添加到数组中
values[valueNumber] = "%"+perValue+"%";
valueNumber++;
keys[keyNumber] = simple;
keyNumber++;
}//结束于closeIt的if
}
}
//时间段查询条件1
if( timeOne !=null && timeOne[0] != null){
hQLString.append(" and t."+timeOne[0] +" between '"+timeOne[1]+"' and '"+timeOne[2]+"'");
countHQLString.append(" and t."+timeOne[0] +" between '"+timeOne[1]+"' and '"+timeOne[2]+"'");
}
//时间段查询条件2
if(timeTwo !=null &&timeTwo[0] != null){
hQLString.append(" and t."+timeTwo[0] +" between '"+timeTwo[1]+"' and '"+timeTwo[2]+"'");
countHQLString.append(" and t."+timeTwo[0] +" between '"+timeTwo[1]+"' and '"+timeTwo[2]+"'");
}
String hql = hQLString.toString();
String countHQL = countHQLString.toString();
Query query = getSession().createQuery(hql);
Query queryCount = getSession().createQuery(countHQL);
//遍历数组赋值给变量
for (int i = 0; i < values.length; i++) {
if(values[i]!=null){
query.setParameter(keys[i],values[i]);
queryCount.setParameter(keys[i],values[i]);
}
}
query.setFirstResult(start);
query.setMaxResults(limit);
List objectList = query.list();
Long count = (Long) queryCount.uniqueResult();
Map<String , Object> map = new HashMap<String, Object>();
map.put("objectList", objectList);
map.put("count", count);
return map;
}
/**
* 《相等(字符串比较)》《相等(数字比较)》《相似》《双时间段》条件《分页》查询通用方法,返回符合条件的Map
* E表示equal相等,C表示close相似,T表示two双时间段
* @author liuyuqin
* @since 2013年11月29日11:26:11
* @param equalStringMap
* @param closeStringMap
* @param timeOne
* @param timeTwo
* @param className
* @param start
* @param limit
* @return
*/
public Map<String , Object> selectPagingMapByE_E_C_T(Map<String, String> equalStringMap ,
Map<String , Integer> equalIntMap , Map<String , String> closeStringMap
,String[] timeOne ,String[] timeTwo,String className,int start,int limit){
String[] values = new String[8];
String[] keys = new String[8];
//创建数组插入标志位置
int valueNumber = 0;
int keyNumber = 0;
StringBuffer hQLString = new StringBuffer();
StringBuffer countHQLString = new StringBuffer();
hQLString.append("from "+className+" as t where t.delstate = "+SystemState.USE);
countHQLString.append("select count(*) from "+className+" as t where t.delstate = "+SystemState.USE);
//遍历查询条件及查询输入值的映射Map;特规定关键字为对象属性,值为对象属性输入值
//该equalStringMap装载等于值
if(equalStringMap!=null){
Iterator equalIt = equalStringMap.keySet().iterator();
//遍历每一个 相等条件 键值对
while(equalIt.hasNext()){
String perKey = (String)equalIt.next();
if(equalStringMap.get(perKey) != null && !(equalStringMap.get(perKey).equals(""))){
String perValue = (String)equalStringMap.get(perKey);
StringBuffer temp = new StringBuffer();
String[] args;
String simple;
if(perKey.contains(".")){
args = perKey.split("\\.");
for (int i = 0; i < args.length; i++) {
temp.append(args[i]);
}
simple = temp.toString();
}
else simple = perKey;
//拼接SQL语句来增加查询条件
hQLString.append(" and t."+perKey+" =:"+simple);
countHQLString.append(" and t."+perKey+" =:"+simple);
//将遍历出的每一个值添加到数组中
values[valueNumber] = perValue;
keys[keyNumber] = simple;
valueNumber++;
keyNumber++;
}//结束于equalIt的if
}
}
//遍历查询条件及查询输入值的映射Map;特规定关键字为对象属性,值为对象属性输入值
//该equalIntMap装载等于值
if(equalIntMap!=null){
Iterator equalIntIt = equalIntMap.keySet().iterator();
//遍历每一个 相等条件 键值对
while(equalIntIt.hasNext()){
String perKey = (String)equalIntIt.next();
if(equalIntMap.get(perKey) != null && !(equalIntMap.get(perKey).equals(""))){
Integer perValue = equalIntMap.get(perKey);
StringBuffer temp = new StringBuffer();
String[] args;
String simple;
if(perKey.contains(".")){
args = perKey.split("\\.");
for (int i = 0; i < args.length; i++) {
temp.append(args[i]);
}
simple = temp.toString();
}
else simple = perKey;
//拼接SQL语句来增加查询条件
hQLString.append(" and t."+perKey +" = "+simple);
countHQLString.append(" and t."+perKey +" = "+simple);
}//结束于equalIntIt的if
}
}
//遍历查询条件及查询输入值的映射Map;特规定关键字为对象属性,值为对象属性输入值
//该closeStringMap装载相似值的map
if(closeStringMap!=null){
Iterator closeIt = closeStringMap.keySet().iterator();
//遍历每一个 相似条件 键值对
while(closeIt.hasNext()){
String perKey = (String)closeIt.next();
if(closeStringMap.get(perKey) != null && !(closeStringMap.get(perKey).equals(""))){
String perValue = (String)closeStringMap.get(perKey);
StringBuffer temp = new StringBuffer();
String[] args;
String simple;
if(perKey.contains(".")){
args = perKey.split("\\.");
for (int i = 0; i < args.length; i++) {
temp.append(args[i]);
}
simple = temp.toString();
}
else simple = perKey;
//拼接HQL语句来增加查询条件
hQLString.append(" and t."+perKey +" like :"+simple);
countHQLString.append(" and t."+perKey +" like :"+simple);
//将遍历出的每一个值添加到数组中
values[valueNumber] = "%"+perValue+"%";
valueNumber++;
keys[keyNumber] = simple;
keyNumber++;
}//结束于closeIt的if
}
}
//时间段查询条件1
if( timeOne !=null && timeOne[0] != null){
hQLString.append(" and t."+timeOne[0] +" between '"+timeOne[1]+"' and '"+timeOne[2]+"'");
countHQLString.append(" and t."+timeOne[0] +" between '"+timeOne[1]+"' and '"+timeOne[2]+"'");
}
//时间段查询条件2
if(timeTwo !=null &&timeTwo[0] != null){
hQLString.append(" and t."+timeTwo[0] +" between '"+timeTwo[1]+"' and '"+timeTwo[2]+"'");
countHQLString.append(" and t."+timeTwo[0] +" between '"+timeTwo[1]+"' and '"+timeTwo[2]+"'");
}
String hql = hQLString.toString();
String countHQL = countHQLString.toString();
Query query = getSession().createQuery(hql);
Query queryCount = getSession().createQuery(countHQL);
//遍历数组赋值给变量
for (int i = 0; i < values.length; i++) {
if(values[i]!=null){
query.setParameter(keys[i],values[i]);
queryCount.setParameter(keys[i],values[i]);
}
}
query.setFirstResult(start);
query.setMaxResults(limit);
List objectList = query.list();
Long count = (Long) queryCount.uniqueResult();
Map<String , Object> map = new HashMap<String, Object>();
map.put("objectList", objectList);
map.put("count", count);
return map;
}
/**
* 《相等(字符串比较)》《相等(数字比较)》《相似》《双时间段》条件查询通用方法,返回符合条件的List
* E表示equal相等,C表示close相似,T表示two双时间段
* @author liuyuqin
* @since 2013年11月29日11:26:11
* @param equalStringMap
* @param closeStringMap
* @param timeOne
* @param timeTwo
* @param className
* @param start
* @param limit
* @return
*/
public List selectMapByE_E_C_T(Map<String, String> equalStringMap ,
Map<String , Integer> equalIntMap , Map<String , String> closeStringMap
,String[] timeOne ,String[] timeTwo,String className,int start,int limit){
String[] values = new String[8];
String[] keys = new String[8];
//创建数组插入标志位置
int valueNumber = 0;
int keyNumber = 0;
StringBuffer hQLString = new StringBuffer();
hQLString.append("from "+className+" as t where t.delstate = "+SystemState.USE);
//遍历查询条件及查询输入值的映射Map;特规定关键字为对象属性,值为对象属性输入值
//该equalStringMap装载等于值
if(equalStringMap!=null){
Iterator equalIt = equalStringMap.keySet().iterator();
//遍历每一个 相等条件 键值对
while(equalIt.hasNext()){
String perKey = (String)equalIt.next();
if(equalStringMap.get(perKey) != null && !(equalStringMap.get(perKey).equals(""))){
String perValue = (String)equalStringMap.get(perKey);
StringBuffer temp = new StringBuffer();
String[] args;
String simple;
if(perKey.contains(".")){
args = perKey.split("\\.");
for (int i = 0; i < args.length; i++) {
temp.append(args[i]);
}
simple = temp.toString();
}
else simple = perKey;
//拼接SQL语句来增加查询条件
hQLString.append(" and t."+perKey+" =:"+simple);
//将遍历出的每一个值添加到数组中
values[valueNumber] = perValue;
keys[keyNumber] = simple;
valueNumber++;
keyNumber++;
}//结束于equalIt的if
}
}
//遍历查询条件及查询输入值的映射Map;特规定关键字为对象属性,值为对象属性输入值
//该equalIntMap装载等于值
if(equalIntMap!=null){
Iterator equalIntIt = equalIntMap.keySet().iterator();
//遍历每一个 相等条件 键值对
while(equalIntIt.hasNext()){
String perKey = (String)equalIntIt.next();
if(equalIntMap.get(perKey) != null && !(equalIntMap.get(perKey).equals(""))){
Integer perValue = equalIntMap.get(perKey);
//拼接SQL语句来增加查询条件
hQLString.append(" and t."+perKey +" = "+perValue);
}//结束于equalIntIt的if
}
}
//遍历查询条件及查询输入值的映射Map;特规定关键字为对象属性,值为对象属性输入值
//该closeStringMap装载相似值的map
if(closeStringMap!=null){
Iterator closeIt = closeStringMap.keySet().iterator();
//遍历每一个 相似条件 键值对
while(closeIt.hasNext()){
String perKey = (String)closeIt.next();
if(closeStringMap.get(perKey) != null && !(closeStringMap.get(perKey).equals(""))){
String perValue = (String)closeStringMap.get(perKey);
StringBuffer temp = new StringBuffer();
String[] args;
String simple;
if(perKey.contains(".")){
args = perKey.split("\\.");
for (int i = 0; i < args.length; i++) {
temp.append(args[i]);
}
simple = temp.toString();
}
else simple = perKey;
//拼接HQL语句来增加查询条件
hQLString.append(" and t."+perKey +" like :"+simple);
//将遍历出的每一个值添加到数组中
values[valueNumber] = "%"+perValue+"%";
valueNumber++;
keys[keyNumber] = simple;
keyNumber++;
}//结束于closeIt的if
}
}
//时间段查询条件1
if( timeOne !=null && timeOne[0] != null){
hQLString.append(" and t."+timeOne[0] +" between '"+timeOne[1]+"' and '"+timeOne[2]+"'");
}
//时间段查询条件2
if(timeTwo !=null &&timeTwo[0] != null){
hQLString.append(" and t."+timeTwo[0] +" between '"+timeTwo[1]+"' and '"+timeTwo[2]+"'");
}
String hql = hQLString.toString();
Query query = getSession().createQuery(hql);
//遍历数组赋值给变量
for (int i = 0; i < values.length; i++) {
if(values[i]!=null){
query.setParameter(keys[i],values[i]);
}
}
return query.list();
}
/**
*遍历可用的表记录,返回符合条件的List
* @author liuyuqin
* @since 2013年11月29日14:49:29
* @param className
* @return
*/
public List queryObjectMap(String className){
try{
String queryString = "from "+className +" as t where t.delstate ="+SystemState.USE;
Query query = getSession().createQuery(queryString);
return query.list();
} catch (HibernateException e) {
// TODO Auto-generated catch block
throw e;
}
}
/**
* 分页遍历可用的表记录,返回符合条件的Map,Map有对象集合和对象集合长度<"objectList","count">;
* @author liuyuqin
* @since 2013年11月29日14:49:29
* @param className
* @param start
* @param limit
* @return
*/
public Map<String , Object> queryPagingObjectMap(String className,int start,int limit){
Map<String , Object> map = new HashMap<String, Object>();
try{
String queryString = "from "+className +" as t where t.delstate ="+SystemState.USE;
String countString = "select count(*) from "+className +" as t where t.delstate ="+SystemState.USE;
Query query = getSession().createQuery(queryString);
Query countQuery = getSession().createQuery(countString);
query.setFirstResult(start);
query.setMaxResults(limit);
List list = query.list();
long count = (Long) countQuery.uniqueResult();
map.put("objectList", list);
map.put("count", count);
return map;
} catch (HibernateException e) {
// TODO Auto-generated catch block
throw e;
}
}
}
备注:start,limit为分页属性,如果有成熟的分页对象,可以稍微修改