限制Spring数据JPA中的结果数量

时间:2017-07-26 06:38:06

标签: java spring postgresql spring-mvc jpa

我的数据库中有20多个表,我需要一个方法来从表中获取所有未删除的行。因此,我写了以下界面:

@NoRepositoryBean
public interface CommonRepositry<T, ID extends Serializable> extends CrudRepository<T, UUID>{
    List<T> findByIsDeleted(boolean isDeleted);
}

我的所有模型存储库都扩展了此CommonRepositry,并且我能够访问所有未删除的行:

public interface ModelNameRepository extends CommonRepositry<ModelName, UUID> { 
// sevral spring JPA methods 

随着表的大小不断增加,我希望对方法返回的结果数量设置可调限制。有两种方法可以解决这两种问题:

docs开始,我应该这样做:

List<User> findTop1000ByIsDeleted(boolean isDeleted);

它只返回前1000行。

问题:我想将此1000外部化到属性文件中,这样如果我必须更改,我只会在一个地方执行此操作。

另一种方法是使用@Query注释并编写SQL查询:

@Query(value = "SELECT * FROM table_name" + " WHERE is_deleted = :isDeleted LIMIT 1000;", nativeQuery = true)
List<T> findByIsDeleted(@Param("isDeleted")boolean isDeleted);

问题:如何获取table_name?我对表名的模型类名称具有简单的CamelCase到camel_case映射。但是如何从T获取模型类名称?

1 个答案:

答案 0 :(得分:3)

问题1:您可以将第二个参数传递给您的查询,称为Pageable。

List<T> findByIsDeleted(boolean isDeleted, Pageable pageable);

Pageable是一个界面,但您可以使用PageRequest实现。它需要两件事来创建PageRequest,页码和大小(意味着你想要获取多少行)。当然,在您的情况下,页码为0,应通过读取属性文件中的值来设置大小。

问题2:您可以将表名外部化为仅包含常量值的类。您可以在实体类的@Table注释中使用这些值,也可以在此处使用。

更多阅读:http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.special-parameters