2017-07-26 51 views
0

我有一個簡單的測試查詢CrudRepository接口內應該返回實體列表。CRudRepository原生查詢無法返回結果集

public interface TestRepository extends CrudRepository<Test, TestId> { 
    @Query(value = "SELECT p FROM test p ", nativeQuery = true) 
    public List<Test> getTests(); 
} 

當我測試這我得到異常:

org.springframework.dao.InvalidDataAccessResourceUsageException:可以 不能提取的ResultSet

如果我不使用本地查詢它作品,但我想使用本機查詢,因爲我想擴展選擇。

回答

0

爲了使您的查詢工作: -

@Query(value = "SELECT * FROM TEST ", nativeQuery = true) 
public List<Test> getTests(); 

原因很簡單,因爲你正在寫原生查詢。 "SELECT p FROM test p"不是原生查詢

0

@Query(值= 「SELECT * FROM檢驗p」,nativeQuery =真)

0

2問題

在本機SQL使用本機SQL :)
@Query(值=「SELECT頁。 * FROM test p「,nativeQuery = true)

您的本機查詢返回Object []或Object []的列表。
如果您向EntityManager提供其他映射信息,則可以更改該設置。
通過這樣做,您可以告訴EntityManager將結果映射到受管實體,特定類型或POJO的標量值。
將本機查詢的結果映射到託管實體的最簡單方法是選擇實體的所有屬性,並將其作爲參數提供給createNativeQuery方法。

(抱歉使用其他實施例)

Query q = em.createNativeQuery("SELECT a.id, a.version, a.firstname, a.lastname FROM Author a", Author.class); 
List<Author> authors = q.getResultList(); 

所有其他映射,如下面的其中一個所述查詢結果映射到POJO,需要被定義爲SQLResultSetMappings。

@SqlResultSetMapping(
     name = "AuthorValueMapping", 
     classes = @ConstructorResult(
       targetClass = AuthorValue.class, 
       columns = { 
        @ColumnResult(name = "id", type = Long.class), 
        @ColumnResult(name = "firstname"), 
        @ColumnResult(name = "lastname"), 
@ColumnResult(name = "numBooks", type = Long.class)})) 

要使用此映射,您需要提供映射的名稱作爲createNativeQuery方法的參數。

Query q = em.createNativeQuery("SELECT a.id, a.firstname, a.lastname, count(b.id) as numBooks FROM Author a JOIN BookAuthor ba on a.id = ba.authorid JOIN Book b ON b.id = ba.bookid GROUP BY a.id", "AuthorValueMapping"); 
List<AuthorValue> authors = q.getResultList();