在线等解决方案哈,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'')

解决方案 »

  1.   

    你用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就可以直接插入到数据库了。
      

  2.   

    上面那句改成SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 如果使用prepareStatement 就是prepareStatement.setDate(1,d);
      

  3.   

    这样试试
    to_date(to_char("+searchInput.getStartDate()+",'yyyy-MM-dd')||' 00:00:00'),'yyyy-MM-dd HH24:MI:SS')
      

  4.   


    谢谢你的回复 ,我刚才试过了,返回值为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();
    }
      

  5.   


    谢谢你的回复,这个也不行,得出来的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'')
      

  6.   

    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();
      

  7.   

    param.put("startDate", "to_date(" + searchInput.getStartDate() + " 00:00:00 , yyyy-mm-dd hh24:mi:ss)");试试这个。
      

  8.   

    debug模式看下到底是在什么时候变的,我拼接sql时没碰到过这种灵异现象。
      

  9.   

    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的值?多打印一下,可能出错的地方都打印,这样好调错!
      

  10.   

    很久没用hibernate了,你用的hibernate吧,建议使用hql语句,对类型支持比较好。
      

  11.   

    楼主这种情况,必然是有别的什么代码做了处理,比如:
       为了防止单引号进入SQL变成注入漏洞,所以将单引号转为双单引号,在SQL的字符串中,这就转义为单个单引号。
      

  12.   


    这次看着显示结果是正确的,不过执行起来提示
    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
      

  13.   


    是用得HIBERNATE,但没法用HQL,得拼装,我只写了简单的一句,其实还有很多其它的SQL要组装。