2017-03-09 239 views
0

我已經使用Spring Initializer,嵌入式Tomcat,Thymeleaf模板引擎以及程序包生成了一個Spring Boot Web應用程序作爲可執行JAR文件。使用在Spring Boot中使用JdbcTemplate

技術:

春季啓動1.4.2.RELEASE,春天4.3.4.RELEASE,Thymeleaf 2.1.5.RELEASE,Tomcat的嵌入8.5.6時,Maven 3,Java的8

我有這個班

public class DeviceEvent { 


     public DeviceEvent(Device device) { 
      this.device = device; 
     } 

     private Device device; 

     private Long id; 

     private Double latitude; 

     private Double longitude; 

     private Date dateReceived; 

     private String message; 

     private Float rssi; 

     private Integer battery; 

     private Boolean alarm; 

     private Boolean processed; 

     public Long getId() { 
      return id; 
     } 

     public void setId(Long id) { 
      this.id = id; 
     } 

     public Device getDevice() { 
      return device; 
     } 

     public void setDevice(Device device) { 
      this.device = device; 
     } 

     public Double getLatitude() { 
      return latitude; 
     } 

     public void setLatitude(Double latitude) { 
      this.latitude = latitude; 
     } 

     public Double getLongitude() { 
      return longitude; 
     } 

     public void setLongitude(Double longitude) { 
      this.longitude = longitude; 
     } 

     public Date getDateReceived() { 
      return dateReceived; 
     } 

     public void setDateReceived(Date dateReceived) { 
      this.dateReceived = dateReceived; 
     } 

     public String getMessage() { 
      return message; 
     } 

     public void setMessage(String message) { 
      this.message = message; 
     } 

     public Float getRssi() { 
      return rssi; 
     } 

     public void setRssi(Float rssi) { 
      this.rssi = rssi; 
     } 

     public Integer getBattery() { 
      return battery; 
     } 

     public void setBattery(Integer battery) { 
      this.battery = battery; 
     } 

     public Boolean getAlarm() { 
      return alarm; 
     } 

     public void setAlarm(Boolean alarm) { 
      this.alarm = alarm; 
     } 

     public Boolean getProcessed() { 
      return processed; 
     } 

     public void setProcessed(Boolean processed) { 
      this.processed = processed; 
     } 
    } 


but I got this error executing this test: 

    Device device = new Device("C380F"); 

      DeviceEvent deviceEvent = new DeviceEvent(device); 

      deviceEvent.setId(Sequencer.getNextVal()); 
      deviceEvent.setAlarm(Boolean.FALSE); 
      deviceEvent.setBattery(78); 
      deviceEvent.setDateReceived(new Date()); 
      deviceEvent.setLatitude(50.834015); 
      deviceEvent.setLongitude(4.377885); 
      deviceEvent.setMessage("FAKE_MSG"); 
      deviceEvent.setProcessed(Boolean.FALSE); 
      deviceEvent.setRssi((float)80); 

      repository.insert(deviceEvent); 


... 

@Override 
    public long insert(DeviceEvent newDeviceEvent) { 

     long id = Sequencer.getNextVal(); 

     int numOfRowsAffected = jdbcTemplate.update(
       "insert into T_DEVICE_EVENT (ID, DEVICE_ID, LATITUDE, LONGITUDE, MESSAGE, DATE_RECEIVED, RSSI, BATTERY, ALARM, PROCESSED) " + 
         " values (?,?,?,?,?,?,?,?,?,?);", 
         id, 
         newDeviceEvent.getDevice().getId(), 
         newDeviceEvent.getLatitude(), 
         newDeviceEvent.getLongitude(), 
         newDeviceEvent.getMessage(), 
         newDeviceEvent.getRssi(), 
         newDeviceEvent.getBattery(), 
         newDeviceEvent.getAlarm(), 
         0); 

     if (numOfRowsAffected==1) return id; 
     else return -1; 


    } 

..

CREATE TABLE IF NOT EXISTS t_device_event (
    id    bigint PRIMARY KEY, 
    device_id  bigint NOT NULL, 
    latitude  decimal NULL, 
    longitude  decimal NULL, 
    message   varchar(100) , 
    date_received timestamp, 
    rssi   float, 
    battery   int, 
    alarm   boolean, 
    processed  boolean, 
    FOREIGN KEY (device_id) REFERENCES public.t_device(id)); 

錯誤:

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [insert into T_DEVICE_EVENT (ID, DEVICE_ID, LATITUDE, LONGITUDE, MESSAGE, DATE_RECEIVED, RSSI, BATTERY, ALARM, PROCESSED) values (?,?,?,?,?,?,?,?,?,?);]; nested exception is java.sql.SQLSyntaxErrorException: incompatible data type in conversion 
    at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:91) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:649) 
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:870) 
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:931) 
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:941) 
    at com.ideefecloud.iot.repository.JdbcDeviceEventRepository.insert(JdbcDeviceEventRepository.java:44) 
    at com.ideefecloud.iot.repository.JdbcDeviceEventRepositoryTests.testInsert(JdbcDeviceEventRepositoryTests.java:54) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
Caused by: java.sql.SQLSyntaxErrorException: incompatible data type in conversion 
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCUtil.throwError(Unknown Source) 
    at org.hsqldb.jdbc.JDBCPreparedStatement.setParameter(Unknown Source) 
    at org.hsqldb.jdbc.JDBCPreparedStatement.setObject(Unknown Source) 
    at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:454) 
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:238) 
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:169) 
    at org.springframework.jdbc.core.ArgumentPreparedStatementSetter.doSetValue(ArgumentPreparedStatementSetter.java:66) 
    at org.springframework.jdbc.core.ArgumentPreparedStatementSetter.setValues(ArgumentPreparedStatementSetter.java:47) 
    at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:875) 
    at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:870) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:633) 
    ... 34 more 
Caused by: org.hsqldb.HsqlException: incompatible data type in conversion 
    at org.hsqldb.error.Error.error(Unknown Source) 
    at org.hsqldb.error.Error.error(Unknown Source) 
    at org.hsqldb.types.DateTimeType.convertJavaToSQL(Unknown Source) 
    ... 44 more 
+0

問題可能出現在數據庫表定義中。看到這裏:http://stackoverflow.com/questions/18842454/org-hsqldb-hsqlexception-data-exception-invalid-character-value-for-cast(btw。可能重複) –

+0

您可以使用localdatetime而不是日期deviceEvent。 setDateReceived(LocalDateTime.now()); – surya

回答

0

我覺得你的列/參數是錯位的。 date_received具體似乎沒有相應的參數,因此它試圖將float(RSSI)轉換爲timestamp