JAVA连ORACEL数据库,动态拼接的SQL运行时单引号总是一个变两

smuwcwt 2012-12-24 02:08:25

在线等解决方案哈,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'')
...全文
494 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
smuwcwt 2012-12-26
  • 打赏
  • 举报
回复
引用 11 楼 ldh911 的回复:
楼主这种情况,必然是有别的什么代码做了处理,比如: 为了防止单引号进入SQL变成注入漏洞,所以将单引号转为双单引号,在SQL的字符串中,这就转义为单个单引号。
昨天跟同事查过了,是做了设置,有个地方把单引号给替换成双单引号了,谢谢你的提醒。
smuwcwt 2012-12-26
  • 打赏
  • 举报
回复
引用 10 楼 txwoaify0506 的回复:
很久没用hibernate了,你用的hibernate吧,建议使用hql语句,对类型支持比较好。
是用得HIBERNATE,但没法用HQL,得拼装,我只写了简单的一句,其实还有很多其它的SQL要组装。
smuwcwt 2012-12-26
  • 打赏
  • 举报
回复
引用 6 楼 abcmsnet 的回复:
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()); Timest……
这次看着显示结果是正确的,不过执行起来提示 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
MiceRice 2012-12-25
  • 打赏
  • 举报
回复
楼主这种情况,必然是有别的什么代码做了处理,比如: 为了防止单引号进入SQL变成注入漏洞,所以将单引号转为双单引号,在SQL的字符串中,这就转义为单个单引号。
txwoaify0506 2012-12-25
  • 打赏
  • 举报
回复
很久没用hibernate了,你用的hibernate吧,建议使用hql语句,对类型支持比较好。
leandzgc 2012-12-25
  • 打赏
  • 举报
回复
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的值?多打印一下,可能出错的地方都打印,这样好调错!
喵主子 2012-12-24
  • 打赏
  • 举报
回复
debug模式看下到底是在什么时候变的,我拼接sql时没碰到过这种灵异现象。
笑莫问 2012-12-24
  • 打赏
  • 举报
回复
param.put("startDate", "to_date(" + searchInput.getStartDate() + " 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(); }
smuwcwt 2012-12-24
  • 打赏
  • 举报
回复
引用 3 楼 wenhaoxp1987 的回复:
这样试试 to_date(to_char("+searchInput.getStartDate()+",'yyyy-MM-dd')||' 00:00:00'),'yyyy-MM-dd HH24:MI:SS')
谢谢你的回复,这个也不行,得出来的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'')
smuwcwt 2012-12-24
  • 打赏
  • 举报
回复
引用 2 楼 abcmsnet 的回复:
上面那句改成SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 如果使用prepareStatement 就是prepareStatement.setDate(1,d);
谢谢你的回复 ,我刚才试过了,返回值为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, 但却获得 NUMBER SELECT * FROM LOG_ATTR WHERE LOG_ATTR.CREATE_TIME >= 2012-12-22 SQL配置没变,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(); }
wenhaoxp1987 2012-12-24
  • 打赏
  • 举报
回复
这样试试 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"); 如果使用prepareStatement 就是prepareStatement.setDate(1,d);
  • 打赏
  • 举报
回复
你用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就可以直接插入到数据库了。

67,511

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧