org.springframework.jdbc.BadSqlGrammarException:PreparedStatementCallback;错误的SQL语法

问题描述

java.rmi.ConnectException: Connection refused to host: santafe.mightygumball.com; nested 
    exception is:
    java.net.ConnectException: Connection timed out: connect
    at java.rmi/sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:623)
    at java.rmi/sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:209)
    at java.rmi/sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:196)
    at java.rmi/sun.rmi.server.UnicastRef.newCall(UnicastRef.java:343)
    at java.rmi/sun.rmi.registry.RegistryImpl_Stub.rebind(RegistryImpl_Stub.java:150)
    at java.rmi/java.rmi.Naming.rebind(Naming.java:177)
    at gumball.GumballMachineTestDrive.main(GumballMachineTestDrive.java:17)
    Caused by: java.net.ConnectException: Connection timed out: connect
    at java.base/sun.nio.ch.Net.connect0(Native Method)
    at java.base/sun.nio.ch.Net.connect(Net.java:493)
    at java.base/sun.nio.ch.Net.connect(Net.java:482)
    at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:588)
    at java.base/java.net.socksSocketImpl.connect(SocksSocketImpl.java:339)
    at java.base/java.net.socket.connect(Socket.java:603)
    at java.base/java.net.socket.connect(Socket.java:552)
    at java.base/java.net.socket.<init>(Socket.java:475)
    at java.base/java.net.socket.<init>(Socket.java:249)
    at 
    java.rmi/sun.rmi.transport.tcp.TCPDirectSocketFactory.createSocket
    (TCPDirectSocketFactory.java:40)
    at java.rmi/sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:617)
    ... 6 more

正在构建错误查询,我期望args的值替换“?” :

StringBuilder myquery = new StringBuilder();

  myquery.append("SELECT * from Student stu")
  .append(" WHERE stu.Roll IN ( '120','140') AND stuv2.Roll is null ")
  .append(" AND date(stu.admission) between ")
  .append("timestamp(").append("?").append(")").append(" AND  CURRENT DATE- 30 DAY");

 final Object[] args = new Object[] {
        getAdm() 
    } ; //its returning '2020-10-01 03:00:00'
    int[] types = new int[] { Types.CHAR  };
    List<Students> result = null;  
    result = jdbcTemplate.query(myquery,args,types,new Mapper());

我遇到以下错误

 SELECT * from Student stu WHERE stu.Roll IN ( '120','140') AND stuv2.Roll is null 
 AND date(stu.admission) between timestamp(?) AND CURRENT DATE-100 DAY

解决方法

看着错误,看来参数至少没有被识别或不被视为日期...

尝试将论点强制转换为日期CAST( "parameter_here" AS DATE)

此外,我宁愿使用MapSqlParameterSource parameters = new MapSqlParameterSource();,但这是不同的主题

编辑bis:jarlh指出并纠正了查询中的错误,您应该纠正一些错字。

您可以查看此线程,该线程类似于:NamedJdbcParameterTemplate : -418 SQL error with setting Date