2017-07-26 46 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();