日期:2014-05-19  浏览次数:20675 次

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的字符串中,这就转义为单个单引号。