一尘不染

查询方法中的Spring Data可选参数

spring

我想在存储库层中编写一些查询方法。此方法必须忽略空参数。例如:

List<Foo> findByBarAndGoo(Bar barParam, @optional Goo gooParam);

在这种情况下,此方法必须返回Foo:

bar == barParam && goo == gooParam;

如果gooParam不为null。如果gooParam为null,则条件更改为:

bar == barParam;

有什么解决办法吗?有人能帮我吗?


阅读 554

收藏
2020-04-20

共2个答案

一尘不染

不确定Bar和Goo之间的关系。检查Example是否可以帮助你。

它为我工作。我有一个类似的情况,实体用户具有属性集,并且有基于属性(可选)搜索用户的findAll方法。

例,

  Class User{
    String firstName;
    String lastName;
    String id;
  }

  Class UserService{
     // All are optional
     List<User> findBy(String firstName, String lastName, String id){
        User u = new User();
        u.setFirstName(firstName);
        u.setLastName(lastName);
        u.setId(id);

        userRepository.findAll(Example.of(user));
        // userRepository is a JpaRepository class
     }
  }
2020-04-20
一尘不染

我认为你无法使用方法名称方法来进行查询定义。从文档(参考):

尽管从方法名派生一个查询很方便,但可能会遇到这样一种情况,即方法名解析器不支持一个人想使用的关键字,或者方法名不必要地变得丑陋。因此,你可以通过命名约定使用JPA命名查询(有关更多信息,请参见使用JPA NamedQueries),或者使用@Query注释查询方法。

我认为你在这里遇到了这种情况,因此下面的答案使用@Query批注方法,这几乎与方法名方法(参考)一样方便。

    @Query("select foo from Foo foo where foo.bar = :bar and "
        + "(:goo is null or foo.goo = :goo)")
    public List<Foo> findByBarAndOptionalGoo(
        @Param("bar") Bar bar, 
        @Param("goo") Goo goo);
2020-04-20