我正在尝试将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: 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,这将是可怕的。
CrudRepository
环境:spring-3.1,spring-data-jpa-1.0.3.RELEASE.jar,spring-data-commons-core-1.1.0.RELEASE.jar
从Spring Data JPA 1.7.0开始(Evans发布培训)。 你可以使用新引入的Top和First关键字来定义查询方法,如下所示:
Top
First
findTop10ByLastnameOrderByFirstnameAsc(String lastname);
Spring Data将自动将结果限制为你定义的数字(如果省略,则默认为1)。请注意,结果的排序在这里变得很重要(通过OrderBy示例中的子句或将Sort参数传递给方法)。在涵盖Spring Data Evans发布系列的新功能的博客文章中或在文档中了解更多内容。
OrderBy
对于以前的版本 为了只检索数据片段,Spring Data使用了分页抽象,该分页抽象Pageable在请求方带有接口,在Page事物的结果侧也带有抽象。所以你可以开始
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));
如果你将其Page用作返回类型,我们并不是要触发要执行的实际查询的计数预测,因为我们需要找出总共有多少个元素来计算元数据。除此之外,请确保你确实为配备了PageRequest排序信息,以获得稳定的结果。否则,即使下面的数据没有更改,你可能会触发两次查询并获得不同的结果。