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)用户,但我找不到注释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 

我find了一个链接: https : //jira.springsource.org/browse/DATAJPA-147 ,我试过但失败了。 现在看来不可能? 为什么在Spring-Data中没有构build这样一个重要的特性?

如果我手动实现此function:

 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

截至Spring Data JPA 1.7.0(Evans发行版)。

…您可以使用新引入的TopFirst关键字,这些关键字允许您定义像这样的查询方法:

 findTop10ByLastnameOrderByFirstnameAsc(String lastname); 

弹簧数据会自动将结果限制为您定义的数字(如果省略,则默认为1)。 请注意,结果的顺序在这里变得相关(通过示例中所见的OrderBy子句或将Sortparameter passing到方法中)。 阅读关于Spring Data Evans发行版新function的博客文章或文档中的更多信息 。

对于以前的版本

仅检索数据切片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); 

如果你需要知道结果的上下文(哪个页面实际上是?是第一个?共有多less个?)使用Page作为返回types:

 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)); 

不是因为我们需要找出总共有多less个元素来计算元数据,我们将触发实际查询的计数投影,以防您使用Page作为返回types。 除此之外,请确保您实际上装备了sorting信息的PageRequest以获得稳定的结果。 否则,您可能会触发查询两次,即使没有更改下面的数据,也会得到不同的结果。

如果您正在使用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)); } } 

有一种方法可以像下面那样提供“通过注释来设置setMaxResults(n)”的等价物:

 public interface ISomething extends JpaRepository<XYZ, Long> { @Query("FROM XYZ a WHERE a.eventDateTime < :before ORDER BY a.eventDateTime DESC") List<XYZ> findXYZRecords(@Param("before") Date before, Pageable pageable); } 

这应该做的伎俩,当一个可分页作为参数发送。 例如,要获取前10个logging,您需要设置为可分页的值:

 new PageRequest(0, 10) 

使用Spring Data Evans(1.7.0 RELEASE)

Spring Data JPA的新版本与另一个名为Evans的模块列表具有使用关键字Top20First来限制查询结果的function,

所以你现在可以写

 List<User> findTop20ByLastname(String lastname, Sort sort); 

要么

 List<User> findTop20ByLastnameOrderByIdDesc(String lastname); 

或为一个单一的结果

 List<User> findFirstByLastnameOrderByIdDesc(String lastname); 

对我来说最好的select是原生查询:

 @Query(value="SELECT * FROM users WHERE other_obj = ?1 LIMIT 1", nativeQuery = true) User findByOhterObj(OtherObj otherObj); 

这也可以使用@QueryHints。 示例下面的示例使用org.eclipse.persistence.config.QueryHints#JDBC_MAX_ROWS

 @Query("SELECT u FROM User u WHERE .....") @QueryHints(@QueryHint(name = JDBC_MAX_ROWS, value = "1")) Voter findUser(); 

如果你的类JpaRepository扩展了JpaRepository你可以使用下面的例子。

 int limited = 100; Pageable pageable = new PageRequest(0,limited); Page<Transaction> transactionsPage = transactionRepository.findAll(specification, pageable); return transactionsPage.getContent(); 

getContent返回一个List<Transaction>