我的数据库中有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
获取模型类名称?
答案 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