JAVA连ORACEL数据库,动态拼接的SQL运行时单引号总是一个变两
在线等解决方案哈,SQL的查询条件是在JAVA里面动态拼接的,传过去时单引号变成了两个,网上找了很多方法,比如说组装时用两个单引号''来代替一个单引号',或者加转义符用\'来代替'等等都解决不了
SQL在XML里面配置如下:
SELECT *
FROM
LOG_ATTR
WHERE
LOG_ATTR.CREATE_TIME >= ${startDate}
JAVA代码如下:
param.put("startDate", "to_date('" + searchInput.getStartDate() + " 00:00:00' , 'yyyy-mm-dd hh24:mi:ss')");
searchInput.getStartDate()返回为String类型的日期值
最后运行时生成的SQL代码是:
SELECT *
FROM
LOG_ATTR
WHERE
LOG_ATTR.CREATE_TIME >= to_date(''2012-12-22 00:00:00'' , ''yyyy-mm-dd hh24:mi:ss'')
------解决方案--------------------你用to_date也就是说你的oracle对应的字段是date类型,那对应的java是java.sql.date类型。你直接用标准类型插进去
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd/HH:mm:ss");
java.sql.Date d= new java.sql.Date((sdf.parse(searchInput.getStartDate() + " 00:00:00")).getTime()));
其中的d就可以直接插入到数据库了。
------解决方案--------------------上面那句改成SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
如果使用prepareStatement 就是prepareStatement.setDate(1,d);
------解决方案--------------------这样试试
to_date(to_char("+searchInput.getStartDate()+",'yyyy-MM-dd')
------解决方案--------------------' 00:00:00'),'yyyy-MM-dd HH24:MI:SS')
------解决方案--------------------SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.sql.Date d;
try {
d = new java.sql.Date((sdf.parse(searchInput.getStartDate() + " 00:00:00")).getTime());
Timestamp ts=new Timestamp(d.getTime()); //加这句
param.put("startDate", ts); //使用ts这次类型一个可以了。
} catch (
ParseException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
------解决方案--------------------param.put("startDate", "to_date(" + searchInput.getStartDate() + " 00:00:00 , yyyy-mm-dd hh24:mi:ss)");
试试这个。
------解决方案--------------------debug模式看下到底是在什么时候变的,我拼接sql时没碰到过这种灵异现象。
------解决方案--------------------param.put("startDate", "to_date('" + searchInput.getStartDate() + " 00:00:00' , 'yyyy-mm-dd hh24:mi:ss')");
直接看楼主的代码是没有问题的,逻辑上写的也对的。怀疑楼主不是因为put失败导致的,是因为其他地方的逻辑错误。楼主既然put了,那么肯定也要get对吧,在你拼接sql以前把你的startDate值打印一下,看看在哪个地方变错的?是在put的时候还是在拼接sql的时候?甚至你拼接sql用的就不是startDate的值?多打印一下,可能出错的地方都打印,这样好调错!
------解决方案--------------------很久没用hibernate了,你用的hibernate吧,建议使用hql语句,对类型支持比较好。
------解决方案--------------------楼主这种情况,必然是有别的什么代码做了处理,比如:
为了防止单引号进入SQL变成注入漏洞,所以将单引号转为双单引号,在SQL的字符串中,这就转义为单个单引号。