setMaxResults for Spring-Data-JPA annotation?

2022-08-31 07:30:51

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

例如,我的代码:

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

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

(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: 07001
ERROR 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


答案 1

截至Spring Data JPA 1.7.0(Evans Release train)。

您可以使用新引入的关键字和关键字来定义查询方法,如下所示:TopFirst

findTop10ByLastnameOrderByFirstnameAsc(String lastname);

Spring Data会自动将结果限制为您定义的数字(如果省略,则默认为1)。请注意,结果的顺序在这里变得相关(通过示例中所示的子句或通过将参数传递到方法中)。在涵盖Spring Data Evans发布系列新功能的博客文章或文档中阅读更多相关信息。OrderBySort

对于以前的版本

为了仅检索数据切片,Spring Data使用分页抽象,该抽象在请求端带有一个接口,并在事物的结果侧带有一个抽象。所以你可以从PageablePage

public interface UserRepository extends Repository<User, Long> {

  List<User> findByUsername(String username, Pageable pageable);
}

并像这样使用它:

Pageable topTen = new PageRequest(0, 10);
List<User> result = repository.findByUsername("Matthews", topTen);

如果您需要知道结果的上下文(它实际上是哪个页面?它是第一个页面吗?总共有多少个?),请使用作为返回类型:Page

public interface UserRepository extends Repository<User, Long> {

  Page<User> findByUsername(String username, Pageable pageable);
}

然后,客户端代码可以执行如下操作:

Pageable topTen = new PageRequest(0, 10);
Page<User> result = repository.findByUsername("Matthews", topTen);
Assert.assertThat(result.isFirstPage(), is(true));

并不是说我们将触发实际查询的计数投影,以防您用作返回类型,因为我们需要找出总共有多少个元素来计算元数据。除此之外,请确保您实际配备了排序信息,以获得稳定的结果。否则,您可能会触发查询两次,即使下面的数据没有变化,也会获得不同的结果。PagePageRequest


答案 2

如果您使用的是 Java 8 和 Spring Data 1.7.0,那么如果要将注释与设置最大结果相结合,则可以使用缺省方法:@Query

public interface UserRepository extends PagingAndSortingRepository<User,Long> {
  @Query("from User u where ...")
  List<User> findAllUsersWhereFoo(@Param("foo") Foo foo, Pageable pageable);

  default List<User> findTop10UsersWhereFoo(Foo foo) {
    return findAllUsersWhereFoo(foo, new PageRequest(0,10));
  }

}

推荐