猿问

Spring-Data-JPA注释的setMaxResults?

Spring-Data-JPA注释的setMaxResults?

我正在尝试将Spring-Data-JPA合并到我的项目中。令我困惑的一件事是如何通过注释实现setMaxResults(n)?

例如,我的代码:

public interface UserRepository extends CrudRepository<User , Long>{
  @Query(value="From User u where u.otherObj = ?1 ")
  public User findByOhterObj(OtherObj otherObj);}

我只需one (and only one)要从otherObj 返回User,但我找不到注释maxResults的方法。有人可以给我一个暗示吗?

(mysql抱怨:

com.mysql.jdbc.JDBC4PreparedStatement@5add5415: select user0_.id as id100_, user0_.created as created100_ from User user0_ where user0_.id=2 limit ** NOT SPECIFIED **WARN  util.JDBCExceptionReporter - SQL Error: 0, SQLState: 07001ERROR util.JDBCExceptionReporter - No value specified for parameter 2

我找到了一个链接:https//jira.springsource.org/browse/DATAJPA-147,我试过但失败了。现在似乎不可能?为什么Spring-Data中没有内置这么重要的功能?

如果我手动实现此功能:

public class UserRepositoryImpl implements UserRepository

我必须实现大量的预定义方法CrudRepository,这将是可怕的。

环境:spring-3.1,spring-data-jpa-1.0.3.RELEASE.jar,spring-data-commons-core-1.1.0.RELEASE.jar


www说
浏览 1259回答 3
3回答

慕的地10843

截至Spring Data JPA 1.7.0(Evans发布列车)。您可以使用新引进的Top并First允许您定义的查询方法是这样的关键字:findTop10ByLastnameOrderByFirstnameAsc(String&nbsp;lastname);Spring Data会自动将结果限制为您定义的数字(如果省略则默认为1)。请注意,结果的排序在这里变得相关(通过OrderBy示例中看到的子句或通过将Sort参数传递给方法)。阅读有关Spring Data Evans发布系列的新功能或文档的博客文章中的更多内容。对于以前的版本为了只检索数据片段,Spring Data使用分页抽象,它Pageable在请求方面提供了一个接口Page,在结果方面也提供了抽象。所以你可以先开始吧public&nbsp;interface&nbsp;UserRepository&nbsp;extends&nbsp;Repository<User,&nbsp;Long>&nbsp;{ &nbsp;&nbsp;List<User>&nbsp;findByUsername(String&nbsp;username,&nbsp;Pageable&nbsp;pageable);}并像这样使用它:Pageable&nbsp;topTen&nbsp;=&nbsp;new&nbsp;PageRequest(0,&nbsp;10);List<User>&nbsp;result&nbsp;=&nbsp;repository.findByUsername("Matthews",&nbsp;topTen);如果你需要知道结果的上下文(它实际上是哪一页?它是第一个?总共有多少?),请使用Page返回类型:public&nbsp;interface&nbsp;UserRepository&nbsp;extends&nbsp;Repository<User,&nbsp;Long>&nbsp;{ &nbsp;&nbsp;Page<User>&nbsp;findByUsername(String&nbsp;username,&nbsp;Pageable&nbsp;pageable);}然后客户端代码可以执行以下操作:Pageable&nbsp;topTen&nbsp;=&nbsp;new&nbsp;PageRequest(0,&nbsp;10);Page<User>&nbsp;result&nbsp;=&nbsp;repository.findByUsername("Matthews",&nbsp;topTen);Assert.assertThat(result.isFirstPage(),&nbsp;is(true));并不是我们将触发要执行的实际查询的计数投影,以防您使用Page返回类型,因为我们需要找出总计有多少元素来计算元数据。除此之外,请确保您实际装备了PageRequest分类信息以获得稳定的结果。否则,您可能会触发查询两次并获得不同的结果,即使数据没有在下面更改。

GCT1015

如果您使用的是Java 8和Spring Data 1.7.0,则可以使用默认方法,如果要将@Query注释与设置最大结果组合使用:public&nbsp;interface&nbsp;UserRepository&nbsp;extends&nbsp;PagingAndSortingRepository<User,Long>&nbsp;{ &nbsp;&nbsp;@Query("from&nbsp;User&nbsp;u&nbsp;where&nbsp;...") &nbsp;&nbsp;List<User>&nbsp;findAllUsersWhereFoo(@Param("foo")&nbsp;Foo&nbsp;foo,&nbsp;Pageable&nbsp;pageable); &nbsp;&nbsp;default&nbsp;List<User>&nbsp;findTop10UsersWhereFoo(Foo&nbsp;foo)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;findAllUsersWhereFoo(foo,&nbsp;new&nbsp;PageRequest(0,10)); &nbsp;&nbsp;}}

狐的传说

有一种方法可以提供相当于“a by注释的setMaxResults(n)”,如下所示:public&nbsp;interface&nbsp;ISomething&nbsp;extends&nbsp;JpaRepository<XYZ,&nbsp;Long>{ &nbsp;&nbsp;&nbsp;&nbsp;@Query("FROM&nbsp;XYZ&nbsp;a&nbsp;WHERE&nbsp;a.eventDateTime&nbsp;<&nbsp;:before&nbsp;ORDER&nbsp;BY&nbsp;a.eventDateTime&nbsp;DESC") &nbsp;&nbsp;&nbsp;&nbsp;List<XYZ>&nbsp;findXYZRecords(@Param("before")&nbsp;Date&nbsp;before,&nbsp;Pageable&nbsp;pageable);}当将可分页作为参数发送时,这应该可以解决问题。例如,要获取前10条记录,您需要将可分页设置为此值:new&nbsp;PageRequest(0,&nbsp;10)
随时随地看视频慕课网APP
我要回答