在线等解决方案哈,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'')
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就可以直接插入到数据库了。
to_date(to_char("+searchInput.getStartDate()+",'yyyy-MM-dd')||' 00:00:00'),'yyyy-MM-dd HH24:MI:SS')
谢谢你的回复 ,我刚才试过了,返回值为NUMBER,也出错。2012-12-24 14:44:02,378 WARN org.hibernate.util.JDBCExceptionReporter.logExceptions:233 - SQL Error: 932, SQLState: 42000
2012-12-24 14:44:02,380 ERROR org.hibernate.util.JDBCExceptionReporter.logExceptions:234 - ORA-00932: 数据类型不一致: 应为 TIMESTAMP, 但却获得 NUMBERSELECT *
FROM
LOG_ATTR
WHERE
LOG_ATTR.CREATE_TIME >= 2012-12-22SQL配置没变,JAVA代码改为:
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());
param.put("startDate", d);
} catch (ParseException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
谢谢你的回复,这个也不行,得出来的SQL是这样的:SELECT *
FROM
LOG_ATTR
WHERE
LOG_ATTR.CREATE_TIME >= to_date(to_char(2012-12-22,''yyyy-MM-dd'')||'' 00:00:00''),''yyyy-MM-dd HH24:MI: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();
}
直接看楼主的代码是没有问题的,逻辑上写的也对的。怀疑楼主不是因为put失败导致的,是因为其他地方的逻辑错误。楼主既然put了,那么肯定也要get对吧,在你拼接sql以前把你的startDate值打印一下,看看在哪个地方变错的?是在put的时候还是在拼接sql的时候?甚至你拼接sql用的就不是startDate的值?多打印一下,可能出错的地方都打印,这样好调错!
为了防止单引号进入SQL变成注入漏洞,所以将单引号转为双单引号,在SQL的字符串中,这就转义为单个单引号。
这次看着显示结果是正确的,不过执行起来提示
Error at line 4
ORA-00933: SQL 命令未正确结束
Script Terminated on line 1.搞不清问题在哪里,抓狂,好像非得用TO_DATE来转一下才可以SELECT *
FROM
LOG_ATTR
WHERE
LOG_ATTR.CREATE_TIME >= 2012-12-22 00:00:00
是用得HIBERNATE,但没法用HQL,得拼装,我只写了简单的一句,其实还有很多其它的SQL要组装。