我在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 :(得分:2)
为了使您的查询有效: -
@Query(value = "SELECT * FROM TEST ", nativeQuery = true)
public List<Test> getTests();
原因很简单,因为您正在编写本机查询。"SELECT p FROM test p"
不是本机查询
答案 1 :(得分:1)
2个问题
在本机SQL中使用本机SQL :) @Query(value =&#34; SELECT p。* FROM test p&#34;,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();
答案 2 :(得分:0)
@Query(value =&#34; SELECT * FROM test p&#34;,nativeQuery = true)