限制 Spring data JPA 中的结果数量

Ake*_*Jha 0 java postgresql spring jpa spring-mvc

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

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

我的所有模型存储库都扩展了这一点CommonRepositry,我可以访问所有未删除的行:

public interface ModelNameRepository extends CommonRepositry<ModelName, UUID> { 
// sevral spring JPA methods 
Run Code Online (Sandbox Code Playgroud)

随着表的大小不断增加,我想对该方法返回的结果数量设置一个可调整的限制。有两种方法可以做到这一点,我对这两种方法都遇到了问题:

文档来看,我应该这样做:

List<User> findTop1000ByIsDeleted(boolean isDeleted);
Run Code Online (Sandbox Code Playgroud)

它只返回前 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);
Run Code Online (Sandbox Code Playgroud)

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

gal*_*ics 6

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

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

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

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

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