1. 程式人生 > >spring中JdbcTemplate的queryForObject(String sql, Class requiredType, Object... args)方法

spring中JdbcTemplate的queryForObject(String sql, Class requiredType, Object... args)方法

1.今天使用JdbcTemplate中的queryForObject(String sql, Class<T> requiredType, Object... args)方法時總是報以下錯誤

org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0     at org.springframework.dao.support.DataAccessUtils.requiredSingleResult(DataAccessUtils.java:71)     at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:730)     at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:749)     at top.pursuedream.test.TestJDBCTemplate.test1(TestJDBCTemplate.java:23)     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.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:389)     at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)     at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:167)     at org.junit.jupiter.engine.execution.ThrowableCollector.execute(ThrowableCollector.java:40)     at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:163)     at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:110)     at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:57)     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$3(HierarchicalTestExecutor.java:83)     at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$null$2(HierarchicalTestExecutor.java:92)     at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)     at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)     at java.util.Iterator.forEachRemaining(Iterator.java:116)     at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)     at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)     at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)     at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)     at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)     at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)     at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$3(HierarchicalTestExecutor.java:92)     at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$null$2(HierarchicalTestExecutor.java:92)     at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)     at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)     at java.util.Iterator.forEachRemaining(Iterator.java:116)     at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)     at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)     at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)     at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)     at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)     at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)     at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$3(HierarchicalTestExecutor.java:92)     at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:51)     at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:43)     at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170)     at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154)     at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90)     at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:82)     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:539)     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:761)     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:461)     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:207)

2.我在網上查詢了許多解決方式,發現均無法解決,而且我的程式碼與網上的提供的一致,初步判斷不是程式碼的問題

  下圖是我的原始碼

3.後來無意中將查詢條件也就是sql語句更改後發現執行成功

基於這個原因我以為是自己的sql書寫錯誤,但是sql書寫錯誤會有sql異常出現,而且我在資料庫中也反覆的執行了原生sql也沒有出現問題,一時間我不知道到底是什麼原因造成了這個原因

4.苦苦的除錯了很長時間,以為是jdbcTemplate出現了bug,後來又一想,這個原因幾乎是不可能的。然而就在我瀏覽網頁的時候突然看到了一個詞編碼,此時我突然想到會不會是連線的資料庫未指定編碼造成的呢?然後我查詢了以下本地資料庫,發現果然如我所想的一樣,我的資料庫編碼不是utf-8的,然後將資料庫的編碼進行了更改,但是這還不夠,還需要將配置檔案中的連線url也指定資料庫的編碼型別

    (1)修改資料庫編碼為utf-8

    (2)修改連線url,指定其字元編碼為utf-8

5.終於解決了這個問題,這次的問題查詢確實讓我受益匪淺