【问题标题】:Spring data repositories - parameter what to retrieve all records?Spring数据存储库 - 参数检索所有记录?
【发布时间】:2016-09-07 09:49:45
【问题描述】:
@Repository
public interface UserDao extends User {
   public List<User> findByFirstname(String firstname);
}

如何使用上述代码检索所有记录? 我试过findByFistname(null);,它不起作用...... 我不想使用findByFirstname();,因为它可能有参数。

希望大家理解。

【问题讨论】:

  • 试用:@Repository public interface UserDao extends JpaRepository&lt;User, Long&gt;。这假设 Long 是主键类型。你必须打电话给findAll();
  • 您还可以扩展 CrudRepository 以将常规 CRUD 功能添加到您的存储库。

标签: java spring spring-data spring-data-jpa


【解决方案1】:

您应该从JpaRepository 扩展您的存储库。注意存储库的名称(它应该遵循约定)。注入 UserRepository bean 后,您将已经通过 findOne()findAll()delete() 等 Spring 数据 crud 方法实现。

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
   //assume your primary key is Long type
}

也很有用documentation

【讨论】:

  • 假设:findByFirstname(String firstname) 可以工作。使用时:findByFirstname("DAVID"),它将返回所有 firstname = "DAVID" 的记录。但我想要的是传入 NULL 或空字符串以返回所有记录,是否可以这样做?我不想使用findAll(),因为某些时候我仍然需要传入参数以满足特定要求。
  • 为什么不使用if (StringUtils.isEmpty(param)) {userRepository.findAll()} else {userRepository.findByFirstname(param}@TSHow
  • 因为我有多个列(现在 6 列)需要过滤...如果使用 if else 方法,那么将有 6*5*4*3*2*1 方法 if... else if...else if * N ... else
  • 您可以发布一些代码来了解您想要实现的目标吗? @TSHow
  • 非常简单,用户可以通过名字、姓氏、性别和身份识别来搜索。 findByFirstnameAndLastnameAndGenderAndIdentityId(String firstname, String lastname, String gender, String identityId)。但在某些时候,用户只能输入名字和性别。
【解决方案2】:

您是否考虑过使用弹簧数据specification?在 spring 数据中,specification 是一种包装 JPA 标准 api 的方法。

JPA Criteria api 背后的想法是通过定义查询对象以编程方式生成查询。

一旦您将条件封装在规范对象中,单个 findAll 方法就可以在许多场景中使用。例如,以编程方式添加基于用户输入的条件,例如额外的搜索过滤器等。

要使用此功能,repo 需要扩展“JpaSpecificationExecutor”

public interface UserRepository extends JpaRepository<User>, JpaSpecificationExecutor {
      List<T> findAll(Specification<T> spec);
}

然后可以使用多个条件调用 find 方法,或者可以根据情况动态构建条件:

List<User> users = userRepository.findAll(where(userLastNameIs("John")).and(userIsArchived())); 

您也可以尝试query by exampe。这里的想法是向示例匹配器提供具有填充搜索字段的实际域对象。配置示例匹配器以控制搜索并将其传递给 findAll 方法。

同样,repo 需要实现一个接口。查看文档以了解每种方法的详细优缺点。

Person person = new Person();                          
person.setFirstname("Dave");                           

ExampleMatcher matcher = ExampleMatcher.matching()     
  .withIgnorePaths("lastname")                         
  .withIncludeNullValues()                             
  .withStringMatcherEnding();                          

Example<Person> example = Example.of(person, matcher);
List<Person> people = personRepository.findAll(example);

【讨论】:

    【解决方案3】:

    正如我从 cmets 那里得到的那样,您试图忽略传递参数的 null 值(而不是通过 findAll() 检索所有记录)。

    很遗憾,目前 Spring 不支持它。

    您可以利用@Query 注释并以这种方式手动编写查询:

    @Query("select u from User u where "
        + "(:firstname is null or u.firstname = :firstname)"
        + "(:lastname is null or u.lastname = :lastname)"
    )
    public List<User> findUserByFirstNameAndLastName(
        @Param("firstname") String firstname, 
        @Param("lastname") String lastname
    );
    

    【讨论】:

      【解决方案4】:

      https://spring.io/blog/2011/02/10/getting-started-with-spring-data-jpa/

      这是一个非常好的 Spring Data 教程。我建议你从它开始。 Spring Data 教程。如果您想更深入,可以阅读文档。

      http://docs.spring.io/spring-data/data-commons/docs/1.6.1.RELEASE/reference/html/repositories.html

      【讨论】:

        猜你喜欢
        • 2014-02-01
        • 2019-05-10
        • 2014-04-14
        • 2020-04-01
        • 2015-06-13
        • 2016-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多