package com.norteksoft.tags.search; import java.sql.Timestamp; import java.text.ParseException; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils; import com.ibm.icu.text.DateFormat; public class SearchParameterDealWith { /** * 查询参数处理 * @param request 请求 * @param entityName 实体的英文名(首字母大写) * @param companyId 公司ID * @return map的key为hql, map的List为参数 */ public static Map<String ,List<Object>> dealWithParametersWithEntity(String searchParameters, String entityName, Long companyId){ //String searchParameters = request.getParameter("searchParameters"); if(StringUtils.isNotEmpty(searchParameters)){ //TODO 可能需要一些对传入条件格式的判断工作,需要前后台配合完成 List<Object> parameterValues = new ArrayList<Object>(); parameterValues.add(0, companyId); int parameterEndIndex = 0; while((parameterEndIndex = searchParameters.indexOf("}"))>=0){ int parameterBeginIndex = searchParameters.indexOf("{"); String parameter = searchParameters.substring(parameterBeginIndex+1, parameterEndIndex); String tempParameter = parameter; if(tempParameter.contains("like")){// ONLY STRING String beforeStr = StringUtils.substringBefore(tempParameter, "like"); if(beforeStr.contains("not ")){ String[] tempParameterPart = tempParameter.split("not like"); String[] tempParameterName = tempParameterPart[0].trim().split("-"); tempParameter = "t." + tempParameterName[1] + " not like ?"; parameterValues.add("%" + tempParameterPart[1].trim() + "%"); }else{ String[] tempParameterPart = tempParameter.split("like"); String[] tempParameterName = tempParameterPart[0].trim().split("-"); tempParameter = "t." + tempParameterName[1] + " like ?"; parameterValues.add("%" + tempParameterPart[1].trim() + "%"); } }else if(tempParameter.contains("=")){// NUMBER OR DATE OR TIME int index = tempParameter.indexOf("="); String sign = tempParameter.substring(index-1, index); if(">".equals(sign)){ String[] tempParameterPart = tempParameter.split(">="); String[] tempParameterName = tempParameterPart[0].trim().split("-"); if("DATE".equals(tempParameterName[0])){ tempParameter = "t." + tempParameterName[1] + " >= ?"; parameterValues.add(stringToDate(tempParameterPart[1].trim())); }else if("TIME".equals(tempParameterName[0])){ tempParameter = "t." + tempParameterName[1] + " >= ?"; parameterValues.add(stringToTimestamp(stringToDate(tempParameterPart[1].trim()))); } }else if("<".equals(sign)){ String[] tempParameterPart = tempParameter.split("<="); String[] tempParameterName = tempParameterPart[0].trim().split("-"); if("DATE".equals(tempParameterName[0])){ tempParameter = "t." + tempParameterName[1] + " <= ?"; parameterValues.add(getDate(stringToDate(tempParameterPart[1].trim()), 23, 59, 59)); }else if("TIME".equals(tempParameterName[0])){ tempParameter = "t." + tempParameterName[1] + " <= ?"; parameterValues.add(stringToTimestamp(getDate(stringToDate(tempParameterPart[1].trim()), 23, 59, 59))); } }else{ String[] tempParameterPart = tempParameter.split("="); String[] tempParameterName = tempParameterPart[0].trim().split("-"); if("DATE".equals(tempParameterName[0])){ tempParameter = "t." + tempParameterName[1] + " = ?"; parameterValues.add(stringToDate(tempParameterPart[1].trim())); }else if("TIME".equals(tempParameterName[0])){ tempParameter = "t." + tempParameterName[1] + " = ?"; parameterValues.add(stringToTimestamp(stringToDate(tempParameterPart[1].trim()))); }else if("NUMBER".equals(tempParameterName[0])){ tempParameter = "t." + tempParameterName[1] + " = ?"; parameterValues.add(Long.valueOf(tempParameterPart[1].trim()).longValue()); } } }else if(tempParameter.contains("<>")){// ONLY NUMBER String[] tempParameterPart = tempParameter.split("<>"); String[] tempParameterName = tempParameterPart[0].trim().split("-"); tempParameter = "t." + tempParameterName[1] + " <> ?"; parameterValues.add(Long.valueOf(tempParameterPart[1].trim()).longValue()); }else if(tempParameter.contains(">")){// NUMBER OR DATE OR TIME String[] tempParameterPart = tempParameter.split(">"); String[] tempParameterName = tempParameterPart[0].trim().split("-"); if("NUMBER".equals(tempParameterName[0])){ tempParameter = "t." + tempParameterName[1] + " > ?"; parameterValues.add(Long.valueOf(tempParameterPart[1].trim()).longValue()); }else if("DATE".equals(tempParameterName[0])){ tempParameter = "t." + tempParameterName[1] + " > ?"; parameterValues.add(stringToDate(tempParameterPart[1].trim())); }else if("TIME".equals(tempParameterName[0])){ tempParameter = "t." + tempParameterName[1] + " > ?"; parameterValues.add(stringToTimestamp(stringToDate(tempParameterPart[1].trim()))); } }else if(tempParameter.contains("<")){// NUMBER OR DATE OR TIME String[] tempParameterPart = tempParameter.split("<"); String[] tempParameterName = tempParameterPart[0].trim().split("-"); if("NUMBER".equals(tempParameterName[0])){ tempParameter = "t." + tempParameterName[1] + " < ?"; parameterValues.add(Long.valueOf(tempParameterPart[1].trim()).longValue()); }else if("DATE".equals(tempParameterName[0])){ tempParameter = "t." + tempParameterName[1] + " < ?"; parameterValues.add(getDate(stringToDate(tempParameterPart[1].trim()), 23, 59, 59)); }else if("TIME".equals(tempParameterName[0])){ tempParameter = "t." + tempParameterName[1] + " < ?"; parameterValues.add(stringToTimestamp(getDate(stringToDate(tempParameterPart[1].trim()), 23, 59, 59))); } } searchParameters = searchParameters.replace("{"+parameter+"}", tempParameter); } String hql = "from " + entityName + " t where t.companyId = ? and " + searchParameters + " order by t.id asc"; Map<String ,List<Object>> parameters = new HashMap<String, List<Object>>(); parameters.put(hql, parameterValues); return parameters; }else{ return null; } } private static Date stringToDate(String dateString){ DateFormat df = DateFormat.getDateInstance(); Date d = null; try { d = df.parse(dateString); } catch (ParseException e) { e.printStackTrace(); } return d; } private static Date getDate(Date date,int h,int s,int m){ Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE), h, s, m); return cal.getTime(); } private static Timestamp stringToTimestamp(Date d){ Timestamp ts = new Timestamp(0); ts.setTime(d.getTime()); return ts; } /** * 无实体的动态查询参数处理-0.01 * @param request 请求 * @return 条件的Map集合 */ public static Map<String, List<Object>> dealWithParametersWithoutEntity(HttpServletRequest request){ String searchParameters = request.getParameter("searchParameters"); if(StringUtils.isNotEmpty(searchParameters)){ Map<String, List<Object>> parameters = new HashMap<String, List<Object>>(); int parameterEndIndex = 0; while((parameterEndIndex = searchParameters.indexOf("}"))>=0){ int parameterBeginIndex = searchParameters.indexOf("{"); String parameter = searchParameters.substring(parameterBeginIndex+1, parameterEndIndex); if(parameter.contains("like")){// ONLY STRING String beforeStr = StringUtils.substringBefore(parameter, "like"); if(beforeStr.contains("not ")){ String[] tempParameterPart = parameter.split("not like"); String[] tempParameterName = tempParameterPart[0].trim().split("-"); List<Object> values = null; if(parameters.containsKey(tempParameterName[1])){ values = parameters.get(tempParameterName[1]); values.add(tempParameterPart[1]); }else{ values = new ArrayList<Object>(); values.add(tempParameterPart[1]); } parameters.put(tempParameterName[1], values); }else{ String[] tempParameterPart = parameter.split("like"); String[] tempParameterName = tempParameterPart[0].trim().split("-"); List<Object> values = null; if(parameters.containsKey(tempParameterName[1])){ values = parameters.get(tempParameterName[1]); values.add(tempParameterPart[1]); }else{ values = new ArrayList<Object>(); values.add(tempParameterPart[1]); } parameters.put(tempParameterName[1], values); } }else if(parameter.contains("=")){// NUMBER OR DATE OR TIME int index = parameter.indexOf("="); String sign = parameter.substring(index-1, index); if(">".equals(sign)){ String[] tempParameterPart = parameter.split(">="); String[] tempParameterName = tempParameterPart[0].trim().split("-"); List<Object> values = null; if(parameters.containsKey(tempParameterName[1])){ values = parameters.get(tempParameterName[1]); values.add(tempParameterPart[1]); }else{ values = new ArrayList<Object>(); values.add(tempParameterPart[1]); } parameters.put(tempParameterName[1], values); }else if("<".equals(sign)){ String[] tempParameterPart = parameter.split("<="); String[] tempParameterName = tempParameterPart[0].trim().split("-"); List<Object> values = null; if(parameters.containsKey(tempParameterName[1])){ values = parameters.get(tempParameterName[1]); values.add(tempParameterPart[1]); }else{ values = new ArrayList<Object>(); values.add(tempParameterPart[1]); } parameters.put(tempParameterName[1], values); }else{ String[] tempParameterPart = parameter.split("="); String[] tempParameterName = tempParameterPart[0].trim().split("-"); List<Object> values = null; if(parameters.containsKey(tempParameterName[1])){ values = parameters.get(tempParameterName[1]); values.add(tempParameterPart[1]); }else{ values = new ArrayList<Object>(); values.add(tempParameterPart[1]); } parameters.put(tempParameterName[1], values); } }else if(parameter.contains("<>")){// ONLY NUMBER String[] tempParameterPart = parameter.split("<>"); String[] tempParameterName = tempParameterPart[0].trim().split("-"); List<Object> values = null; if(parameters.containsKey(tempParameterName[1])){ values = parameters.get(tempParameterName[1]); values.add(tempParameterPart[1]); }else{ values = new ArrayList<Object>(); values.add(tempParameterPart[1]); } parameters.put(tempParameterName[1], values); }else if(parameter.contains(">")){// NUMBER OR DATE OR TIME String[] tempParameterPart = parameter.split(">"); String[] tempParameterName = tempParameterPart[0].trim().split("-"); List<Object> values = null; if(parameters.containsKey(tempParameterName[1])){ values = parameters.get(tempParameterName[1]); values.add(tempParameterPart[1]); }else{ values = new ArrayList<Object>(); values.add(tempParameterPart[1]); } parameters.put(tempParameterName[1], values); }else if(parameter.contains("<")){// NUMBER OR DATE OR TIME String[] tempParameterPart = parameter.split("<"); String[] tempParameterName = tempParameterPart[0].trim().split("-"); List<Object> values = null; if(parameters.containsKey(tempParameterName[1])){ values = parameters.get(tempParameterName[1]); values.add(tempParameterPart[1]); }else{ values = new ArrayList<Object>(); values.add(tempParameterPart[1]); } parameters.put(tempParameterName[1], values); } searchParameters = searchParameters.replace("{"+parameter+"}", ""); } return parameters; }else{ return null; } } /** * 无实体的动态查询参数处理-0.02 * @param request 请求 * @return SQL语句中的条件语句 */ public static Map<String, List<Object>> dealWithParametersWithColumns(String searchParameters){ //String searchParameters = request.getParameter("searchParameters"); if(StringUtils.isNotEmpty(searchParameters)){ List<Object> parameterValues = new ArrayList<Object>(); int parameterEndIndex = 0; while((parameterEndIndex = searchParameters.indexOf("}"))>=0){ int parameterBeginIndex = searchParameters.indexOf("{"); String parameter = searchParameters.substring(parameterBeginIndex+1, parameterEndIndex); String tempStr = parameter; if(tempStr.contains("like")){// ONLY STRING String beforeStr = StringUtils.substringBefore(tempStr, "like"); if(beforeStr.contains("not ")){ String[] tempParameterPart = tempStr.split("not like"); String[] tempParameterName = tempParameterPart[0].trim().split("-"); tempStr = tempParameterName[1] + " not like ?"; parameterValues.add("%" + tempParameterPart[1].trim() + "%"); }else{ String[] tempParameterPart = tempStr.split("like"); String[] tempParameterName = tempParameterPart[0].trim().split("-"); tempStr = tempParameterName[1] + " like ?"; parameterValues.add("%" + tempParameterPart[1].trim() + "%"); } }else if(tempStr.contains("=")){// NUMBER OR DATE OR TIME int index = tempStr.indexOf("="); String sign = tempStr.substring(index-1, index); if(">".equals(sign)){ String[] tempParameterPart = tempStr.split(">="); String[] tempParameterName = tempParameterPart[0].trim().split("-"); if("DATE".equals(tempParameterName[0])){ tempStr = tempParameterName[1] + " >= ?"; parameterValues.add(stringToDate(tempParameterPart[1].trim())); }else if("TIME".equals(tempParameterName[0])){ tempStr = tempParameterName[1] + " >= ?"; parameterValues.add(stringToTimestamp(stringToDate(tempParameterPart[1].trim()))); } }else if("<".equals(sign)){ String[] tempParameterPart = tempStr.split("<="); String[] tempParameterName = tempParameterPart[0].trim().split("-"); if("DATE".equals(tempParameterName[0])){ tempStr = tempParameterName[1] + " <= ?"; parameterValues.add(getDate(stringToDate(tempParameterPart[1].trim()), 23, 59, 59)); }else if("TIME".equals(tempParameterName[0])){ tempStr = tempParameterName[1] + " <= ?"; parameterValues.add(stringToTimestamp(getDate(stringToDate(tempParameterPart[1].trim()), 23, 59, 59))); } }else{ String[] tempParameterPart = tempStr.split("="); String[] tempParameterName = tempParameterPart[0].trim().split("-"); if("DATE".equals(tempParameterName[0])){ tempStr = tempParameterName[1] + " = ?"; parameterValues.add(stringToDate(tempParameterPart[1].trim())); }else if("TIME".equals(tempParameterName[0])){ tempStr = tempParameterName[1] + " = ?"; parameterValues.add(stringToTimestamp(stringToDate(tempParameterPart[1].trim()))); }else if("NUMBER".equals(tempParameterName[0])){ tempStr = tempParameterName[1] + " = ?"; parameterValues.add(Long.valueOf(tempParameterPart[1].trim()).longValue()); } } }else if(tempStr.contains("<>")){// ONLY NUMBER String[] tempParameterPart = tempStr.split("<>"); String[] tempParameterName = tempParameterPart[0].trim().split("-"); tempStr = tempParameterName[1] + " <> ?"; parameterValues.add(Long.valueOf(tempParameterPart[1].trim()).longValue()); }else if(tempStr.contains(">")){// NUMBER OR DATE OR TIME String[] tempParameterPart = tempStr.split(">"); String[] tempParameterName = tempParameterPart[0].trim().split("-"); if("NUMBER".equals(tempParameterName[0])){ tempStr = tempParameterName[1] + " > ?"; parameterValues.add(Long.valueOf(tempParameterPart[1].trim()).longValue()); }else if("DATE".equals(tempParameterName[0])){ tempStr = tempParameterName[1] + " > ?"; parameterValues.add(stringToDate(tempParameterPart[1].trim())); }else if("TIME".equals(tempParameterName[0])){ tempStr = tempParameterName[1] + " > ?"; parameterValues.add(stringToTimestamp(stringToDate(tempParameterPart[1].trim()))); } }else if(tempStr.contains("<")){// NUMBER OR DATE OR TIME String[] tempParameterPart = tempStr.split("<"); String[] tempParameterName = tempParameterPart[0].trim().split("-"); if("NUMBER".equals(tempParameterName[0])){ tempStr = tempParameterName[1] + " < ?"; parameterValues.add(Long.valueOf(tempParameterPart[1].trim()).longValue()); }else if("DATE".equals(tempParameterName[0])){ tempStr = tempParameterName[1] + " < ?"; parameterValues.add(getDate(stringToDate(tempParameterPart[1].trim()), 23, 59, 59)); }else if("TIME".equals(tempParameterName[0])){ tempStr = tempParameterName[1] + " < ?"; parameterValues.add(stringToTimestamp(getDate(stringToDate(tempParameterPart[1].trim()), 23, 59, 59))); } } searchParameters = searchParameters.replace("{"+parameter+"}", tempStr); } Map<String ,List<Object>> parameters = new HashMap<String, List<Object>>(); parameters.put(searchParameters, parameterValues); return parameters; }else{ return null; } } public static void main(String[] args) { String parameter1 = "({DATE-createDate < 2010-12-10} or {STRING-title like 自己}) and {STRING-groupName like 测试}"; String parameter2 = "{STRING-groupName like 并发} or (({NUMBER-active = 2} and {DATE-transactDate < 2010-12-10}) and {STRING-creatorName like 吴荣})"; @SuppressWarnings("unused") Map<String, List<Object>> aa = SearchParameterDealWith.dealWithParametersWithEntity(parameter1, "task", 8050l); @SuppressWarnings("unused") Map<String, List<Object>> bb = SearchParameterDealWith.dealWithParametersWithColumns(parameter2); //System.out.println(SearchParameterDealWith.DealWithcolumnName("replaceMentList")); } }