@Repository
public interface UserDao extends User {
public List<User> findByFirstname(String firstname);
}
我如何使用上面的代码来检索所有记录?
我试过了findByFistname(null);
,它没有工作......
我不想使用findByFirstname();
,因为它可能有参数。
希望大家都明白。
答案 0 :(得分:2)
您应该从JpaRepository
扩展您的存储库。小心存储库的名称(它应遵循惯例)。注入UserRepository
bean之后,您已经通过findOne()
,findAll()
,delete()
等春季数据方法实现了这些方法。
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
//assume your primary key is Long type
}
同样有用documentation
答案 1 :(得分:1)
您是否考虑使用弹簧数据specification?在spring数据中,specification是一种包含JPA标准api的方法。
JPA Criteria api背后的想法是通过定义查询对象以编程方式生成查询。
在规范对象中封装条件后,可以在多种方案中使用单个findAll方法。例如,以编程方式从用户添加基于输入的条件,例如其他搜索过滤器等。
要使用此功能,回购将需要扩展&#34; JpaSpecificationExecutor&#34;
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);
答案 2 :(得分:1)
正如我从评论中得到的那样,您试图忽略传递参数的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
);
答案 3 :(得分:0)
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