限制Spring data JPA中的结果数量

hmae6n7t  于 2023-10-19  发布在  Spring
关注(0)|答案(2)|浏览(151)

我有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

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

List<User> findTop1000ByIsDeleted(boolean isDeleted);

它只返回前一千行。

**问题:**我想把这个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_caseMap。但是如何从T中获取模型类名呢?

wgx48brx

wgx48brx1#

**问题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

s2j5cfk0

s2j5cfk02#

从版本3.2.0-M1开始,您还可以使用Limit代替Pageable

List<User> findByIsDeleted(boolean isDeleted, Limit.of(1000));

由于1000现在只是一个简单的值,您可以从属性文件中获取它,使其成为常量或从任何您想要的地方获取它。
参见:https://github.com/spring-projects/spring-data-jpa/issues/3052https://github.com/spring-projects/spring-data-commons/issues/2827,特别是此处的文档位https://github.com/spring-projects/spring-data-commons/commit/a5408a478d015bb5e83de62c3872119b02ad89a7

相关问题