ibatisダイナミッククエリー
最近プロジェクトが必要で、動的なクエリーをしました.クエリーの結果をページに戻して表示します.
クエリーするフィールドとテーブル名はダイナミックで、バックグラウンドでつづられています.
しかしibatisで実行すると常に「カラム名が無効」と報告され、sql/plusで実行すると正常です.
何度考えても理解できない.
その後、資料を調べることで、以下のように解決しました.
ただし、remapResults=「true」は必須です.そうしないと、カラム名が無効なエラーが報告されます.
フロントに表を描きます.
バックグラウンドでは、クエリの結果をjson形式の文字に解析します.
クエリーするフィールドとテーブル名はダイナミックで、バックグラウンドでつづられています.
しかしibatisで実行すると常に「カラム名が無効」と報告され、sql/plusで実行すると正常です.
何度考えても理解できない.
その後、資料を調べることで、以下のように解決しました.
<select id="queryLogInfo" resultClass="java.util.HashMap" remapResults= "true " parameterClass="java.util.Map" >
select t.CREATOR,t.CREATE_DT,decode(o.BUSI_OPER_TYPE,'1',' ','2',' ','3',' ') as OPER_TYPE, $colNames$
from $tableName$ t,TAS_OPERATION_LOG o
where $pkIdName$ = #pkIdValue#
and t.log_id = #logId#
</select>
ただし、remapResults=「true」は必須です.そうしないと、カラム名が無効なエラーが報告されます.
フロントに表を描きます.
function doSelectAction(Re){
//
var str = Re.responseText.evalJSON();
var keys = str.keys;
var showNames = str.showNames;
//
var showNamesArray = showNames.split(",");
//sqlMap 。
var keysArray = keys.split(",");
//
var tem = str.logStrlist.evalJSON();
//
document.getElementById("newbody").innerText = '';
//
var row=document.createElement("tr");
for(var j=0;j<showNamesArray.length;j++){
var cell = document.createElement("td");
cell.align = 'center';
cell.appendChild(document.createTextNode(showNamesArray[j]));
row.appendChild (cell);
}
document.getElementById("newHead").appendChild (row);
//
tem.each(function(obj){
var row=document.createElement("tr");
for(var i=0;i<keysArray.length;i++){
var cell = document.createElement("td");
cell.align = 'center';
cell.appendChild(document.createTextNode(obj[keysArray[i]]));
row.appendChild (cell);
}
document.getElementById("newbody").appendChild(row);
});
//senfe(" "," "," "," "," ");
senfe("newbody","#f8fbfc","#e5f1f4","#ecfbd4","#bce774");
}
function senfe(o,a,b,c,d){
var t=document.getElementById(o).getElementsByTagName("tr");
for(var i=0;i<t.length;i++){
t[i].style.backgroundColor=(t[i].sectionRowIndex%2==0)?a:b;
// t[i].onclick=function(){
// if(this.x!="1"){
// this.x="1";
// this.style.backgroundColor=d;
// }else{
// this.x="0";
// this.style.backgroundColor=(this.sectionRowIndex%2==0)?a:b;
// }
// }
t[i].onmouseover=function(){
if(this.x!="1")this.style.backgroundColor=c;
}
t[i].onmouseout=function(){
if(this.x!="1")this.style.backgroundColor=(this.sectionRowIndex%2==0)?a:b;
}
}
}
バックグラウンドでは、クエリの結果をjson形式の文字に解析します.
public ActionForward getInit(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
OperationBO operationBO = null;
JSONObject data = new JSONObject();
try {
response.setContentType("text/json");
response.setCharacterEncoding("UTF-8");
PrintWriter out = null;
operationBO = (OperationBO) InteractionObjectFactory.getInstance()
.getInteractionObject("TP_OperationBO",
getAppContext(request));
String logId = request.getParameter("logId");
String operType = request.getParameter("operType");
//
Map map = operationBO.queryLogInfo(logId, operType);
List logList = (List) map.get("resultlist");
JSONArray logJsonList = JSONArray.fromObject(logList);
String logStrlist = logJsonList.toString();
try {
out = response.getWriter();
data.put("logStrlist", logStrlist);
data.put("keys", (String) map.get("keys"));
data.put("showNames", (String) map.get("showNames"));
out.println(data.toString());
} catch (JSONException e) {
e.printStackTrace();
} finally {
out.flush();
out.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}