在一个web项目中,使用最新的spring-data(1.10.2)和MySQL5.6数据库,我试图使用带分页的本机查询,但在启动时遇到的是org.springframework.data.jpa.repository.query.invalidJPAQueryMethodException
。
根据示例50,在使用来自spring-data文档的@query时,可以指定查询本身和countQuery,如下所示:
public interface UserRepository extends JpaRepository<User, Long> {
@Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",
countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
nativeQuery = true)
Page<User> findByLastname(String lastname, Pageable pageable);
}
出于好奇,在nativejpaquery
类中,我可以看到它包含以下代码,以检查它是否是有效的jpa查询:
public NativeJpaQuery(JpaQueryMethod method, EntityManager em, String queryString, EvaluationContextProvider evaluationContextProvider, SpelExpressionParser parser) {
super(method, em, queryString, evaluationContextProvider, parser);
JpaParameters parameters = method.getParameters();
boolean hasPagingOrSortingParameter = parameters.hasPageableParameter() || parameters.hasSortParameter();
boolean containsPageableOrSortInQueryExpression = queryString.contains("#pageable") || queryString.contains("#sort");
if(hasPagingOrSortingParameter && !containsPageableOrSortInQueryExpression) {
throw new InvalidJpaQueryMethodException("Cannot use native queries with dynamic sorting and/or pagination in method " + method);
}
}
我的查询包含一个pageable
参数,因此haspagingorsortingParameter
是true
,但它也在QueryString
中查找一个#pageable
或#sort
序列,我没有提供这个序列。
我尝试在查询结尾添加#pageable
(这是一个注释),这使得验证能够通过,但在执行时失败,表示查询需要一个额外的参数:3而不是2。
有趣的是,如果我在运行时手动将containspageableorsortInqueryExpression
从false
更改为true
,那么查询工作很好,所以我不知道为什么它要在我的QueryString
处检查该字符串,也不知道如何提供它。
任何帮助都将不胜感激。
更新01/30/2018看来spring-data project的开发人员正在用Jens Schauder的PR修复这个问题
我提前道歉,这几乎是对最初的问题和Janar的评论的总结,然而...
我遇到了同样的问题:我找到了Spring Data的示例50作为我需要使用分页的本机查询的解决方案,但是Spring在启动时抱怨我不能对本机查询使用分页。
我只想报告我使用分页成功运行了所需的本机查询,并使用了以下代码:
@Query(value="SELECT a.* "
+ "FROM author a left outer join mappable_natural_person p on a.id = p.provenance_id "
+ "WHERE p.update_time is null OR (p.provenance_name='biblio_db' and a.update_time>p.update_time)"
+ "ORDER BY a.id \n#pageable\n",
/*countQuery="SELECT count(a.*) "
+ "FROM author a left outer join mappable_natural_person p on a.id = p.provenance_id "
+ "WHERE p.update_time is null OR (p.provenance_name='biblio_db' and a.update_time>p.update_time) \n#pageable\n",*/
nativeQuery=true)
public List<Author> findAuthorsUpdatedAndNew(Pageable pageable);
问题内容: 在一个网络项目中,将最新的spring-data(1.10.2)与MySQL 5.6数据库一起使用,我试图将本机查询与分页一起使用,但是在启动时遇到了问题。 根据spring-data文档中使用的示例50,可以指定查询本身和countQuery,如下所示: 出于好奇,在课堂上我可以看到它包含以下代码来检查其是否为有效的jpa查询: 我的查询中包含一个参数,所以是的,但它也在寻找或序列里
就像你可以看到注释“#sort”还在那里一样。 我尝试过Spring Data和带分页的本机查询,但注释还在,而使用另一个语法,如?#{#sort}或{#sort},问题仍然存在。 什么都欢迎。
我有一个简单的查询如下“select * from USERS”。我还使用Pageable来启用分页。 此查询可能具有基于给定参数是否为 null 的可选谓词。 例如,如果给定了“code”参数且该参数不为空,则查询变为“select * from USERS where code =:code”; 据我所知,我不能使用@Query注释来实现这一点。我可以实现一个定制的存储库,并使用EntityM
问题内容: 我正在使用Spring Data JPA,当我用来定义一个 WITHOUT 的查询时,它可以工作: 但是,如果我添加第二个参数,则将无法正常工作,Spring将解析该方法的名称,然后抛出 异常 。这是错误吗? 问题答案: 在Spring论坛上提出了一个类似的问题,指出要应用分页,必须派生第二个子查询。因为子查询引用的是相同的字段,所以您需要确保查询对引用的实体/表使用别名。这意味着您在
我使用Spring引导和Spring数据JPA。它工作得很好但是!我需要使用复杂的本地查询从Oracle数据库(源数据从SAP ERP)。 假设查询包含5个joned表(一个键或组合键)。我可以使用很多参数。 解决方案: 1)由于耗时,使用JPA为该查询编写新查询是不真实的。创建表之间的所有键关系似乎很复杂。 2)为了运行这些查询,我使用JDBC。这很容易,因为我准备了本机查询。但我深信这种做法是