--- /dev/null
+package com.lavans.luz2.commons;\r
+\r
+import java.math.BigDecimal;\r
+import java.util.Date;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
+import org.apache.commons.logging.Log;\r
+import org.apache.commons.logging.LogFactory;\r
+\r
+import com.lavans.luz2.util.CondTypeEnum;\r
+import com.lavans.luz2.util.Config;\r
+\r
+public class DaoUtils {\r
+ /** ロガー */\r
+ private static Log logger = LogFactory.getLog(DaoUtils.class);\r
+ //private static final String CLASSNAME=DaoUtils.class.getName();\r
+\r
+ /**\r
+ * IN句の文字列作成\r
+ * @param <T>\r
+ * @param objs\r
+ * @param prefix\r
+ * @param params パラメータ用Map。ここに格納される。\r
+ * @return\r
+ */\r
+ public static String makeInCond(String[] objs, String prefix, Map<String, String[]> params){\r
+ if(objs.length==0) throw new IllegalArgumentException("target's length==0.");\r
+ StringBuilder str = new StringBuilder();\r
+ for(int i=0; i<objs.length; i++){\r
+ str.append(",:"+prefix+i);\r
+ params.put(prefix+i, new String[]{objs[i]});\r
+ }\r
+ return str.substring(1);\r
+ }\r
+\r
+ // どうせWebからStringでしか指定しないんだからジェネリックいらないかも\r
+// public static <T> String makeInCond(T[] objs, String prefix, HashMap<String, Object> params){\r
+// if(objs.length==0) throw new IllegalArgumentException("target's length==0.");\r
+// StringBuilder str = new StringBuilder();\r
+// for(int i=0; i<objs.length; i++){\r
+// str.append(",:"+prefix+i);\r
+// params.put(prefix+i, objs[i]);\r
+// }\r
+// return " IN ("+ str.substring(1)+ ")";\r
+// }\r
+\r
+ public static String getSql(Class<?> clazz, String key){\r
+ return getSql(clazz.getName(), key);\r
+ }\r
+ public static String getSql(String className, String key){\r
+ Config config = Config.getInstance(className.replace(".","/")+".xml");\r
+ String sql="";\r
+ try {\r
+ sql = config.getNodeValue("/sql/"+key).trim();\r
+ } catch (Exception e) {\r
+ logger.error("SQLが見つかりません。["+ key +"]", e);\r
+ }\r
+\r
+ return sql;\r
+ }\r
+\r
+ /**\r
+ * 検索条件の設定。ここでは特定のprefixがついたkey=valueを取得するだけ\r
+ */\r
+ public static Map<String, String[]> getSearchCond(Map<String, String[]> requestParameters, String prefix){\r
+ Map<String, String[]> map = new HashMap<String, String[]>();\r
+ // just only get "search condition paraemters" here. it use later.\r
+ for(Map.Entry<String, String[]> entry: requestParameters.entrySet()){\r
+ if(entry.getKey().startsWith(prefix)){\r
+ map.put(entry.getKey().substring(prefix.length()), entry.getValue());\r
+ }\r
+ }\r
+ return map;\r
+ }\r
+\r
+ /**\r
+ * make SQL where phrase from search condtions.\r
+ * @return\r
+ */\r
+ public static String getWherePhrase(Set<String> attributeNames, Map<String, String[]> cond){\r
+ // null check.\r
+ if(cond==null){\r
+ return "";\r
+ }\r
+\r
+ // SQL construction start.\r
+ StringBuilder builder = new StringBuilder();\r
+ for(String attributeName: attributeNames){\r
+ String key = attributeName +"."+ StringUtils.toCamelCase(CondTypeEnum.EQUAL.toString());\r
+ if((cond.get(key)!=null) && !StringUtils.isEmpty(cond.get(key)[0])){\r
+ builder.append(" AND "+ StringUtils.toUnderscore(attributeName).toUpperCase() +"= :"+ key);\r
+ }\r
+ key = attributeName +"."+ StringUtils.toCamelCase(CondTypeEnum.GREATER_EQUAL.toString());\r
+ if((cond.get(key)!=null) && !StringUtils.isEmpty(cond.get(key)[0])){\r
+ builder.append(" AND "+ StringUtils.toUnderscore(attributeName).toUpperCase() +">= :"+ key);\r
+ }\r
+ key = attributeName +"."+ StringUtils.toCamelCase(CondTypeEnum.LESS_OR_EQUAL.toString());\r
+ if((cond.get(key)!=null) && !StringUtils.isEmpty(cond.get(key)[0])){\r
+ builder.append(" AND "+ StringUtils.toUnderscore(attributeName).toUpperCase() +"<= :"+ key);\r
+ }\r
+\r
+ // fuzzy search\r
+ key = attributeName +"."+ StringUtils.toCamelCase(CondTypeEnum.FUZZY_SEARCH.toString());\r
+ if((cond.get(key)!=null) && !StringUtils.isEmpty(cond.get(key)[0])){\r
+ builder.append(" AND "+ StringUtils.toUnderscore(attributeName).toUpperCase() +" LIKE :"+ key);\r
+ // replace keyword\r
+ cond.get(key)[0]="%"+cond.get(key)[0]+"%";\r
+ }\r
+\r
+ // prefix search\r
+ key = attributeName +"."+ StringUtils.toCamelCase(CondTypeEnum.PREFIX_SEARCH.toString());\r
+ if((cond.get(key)!=null) && !StringUtils.isEmpty(cond.get(key)[0])){\r
+ builder.append(" AND "+ StringUtils.toUnderscore(attributeName).toUpperCase() +" LIKE :"+ key);\r
+ // replace keyword\r
+ cond.get(key)[0]=cond.get(key)[0]+"%";\r
+ }\r
+\r
+ // suffix search\r
+ key = attributeName +"."+ StringUtils.toCamelCase(CondTypeEnum.SUFFIX_SEARCH.toString());\r
+ if((cond.get(key)!=null) && !StringUtils.isEmpty(cond.get(key)[0])){\r
+ builder.append(" AND "+ StringUtils.toUnderscore(attributeName).toUpperCase() +" LIKE :"+ key);\r
+ // replace keyword\r
+ cond.get(key)[0]="%"+cond.get(key)[0];\r
+ }\r
+\r
+ // multiple values\r
+ key = attributeName +"."+ StringUtils.toCamelCase(CondTypeEnum.MULTIPLE.toString());\r
+ if((cond.get(key)!=null) && !StringUtils.isEmpty(cond.get(key)[0])){\r
+ builder.append(" AND "+ StringUtils.toUnderscore(attributeName).toUpperCase() +" IN ( "+ makeInCond(cond.get(key),attributeName,cond) +")");\r
+ }\r
+\r
+ // comma separated values\r
+ key = attributeName +"."+ StringUtils.toCamelCase(CondTypeEnum.LIST.toString());\r
+ if((cond.get(key)!=null) && !StringUtils.isEmpty(cond.get(key)[0])){\r
+ // separate all keys\r
+ String conds[] = StringUtils.splitTrim(cond.get(key)[0], ",");\r
+ builder.append(" AND "+ StringUtils.toUnderscore(attributeName).toUpperCase() +" IN ( "+ makeInCond(conds,attributeName,cond) +")");\r
+ }\r
+ }\r
+\r
+ return builder.toString();\r
+ }\r
+\r
+ /**\r
+ * 検索条件をMap<String,String[]>からMap<String,Object>に変換。\r
+ * InteterとかLongとか型渡して変換した方がよさそう。\r
+ *\r
+ */\r
+ public static Map<String, Object> convertSearchCond(Map<String, String[]> cond, Map<String,Class<?>> attributeInfo){\r
+ Map<String, Object> result = new HashMap<String, Object>();\r
+ for(Map.Entry<String, String[]> entry: cond.entrySet()){\r
+ // 値が指定されていなければ評価しない\r
+ if(StringUtils.isEmpty(entry.getValue()[0])){\r
+ continue;\r
+ }\r
+\r
+ // 属性名は.より前の部分(ex memberId.equal\r
+ if(!entry.getKey().contains(".")){\r
+ logger.debug("No condtion ["+ entry.getKey() +"]");\r
+ continue;\r
+ }\r
+ String attributeName = entry.getKey().split("\\.")[0];\r
+ // この属性の型情報を取得\r
+ Class<?> clazz = attributeInfo.get(attributeName);\r
+ // 念のためnullチェック\r
+ if(clazz==null){\r
+ logger.debug("No attribute Info,["+ attributeName +"]");\r
+ continue;\r
+ }\r
+\r
+ if(clazz.equals(Integer.class)){\r
+ result.put(entry.getKey(), Integer.valueOf(entry.getValue()[0]));\r
+ }else if(clazz.equals(Long.class)){\r
+ result.put(entry.getKey(), Long.valueOf(entry.getValue()[0]));\r
+ }else if(clazz.equals(Double.class)){\r
+ result.put(entry.getKey(), Double.valueOf(entry.getValue()[0]));\r
+ }else if(clazz.equals(BigDecimal.class)){\r
+ result.put(entry.getKey(), new BigDecimal(entry.getValue()[0]));\r
+// }else if(clazz.equals(byte[].class)){\r
+// // バイナリは検索不可\r
+// result.put(entry.getKey(), byte.valueOf(entry.getValue()[0]));\r
+ }else if(clazz.equals(Date.class)){\r
+ result.put(entry.getKey(), DateUtils.getDate(entry.getValue()[0]));\r
+ }else{\r
+ // String\r
+ result.put(entry.getKey(), entry.getValue()[0]);\r
+ }\r
+\r
+ }\r
+ return result;\r
+ }\r
+}\r