我想在存储库层中编写一些查询方法。此方法必须忽略空参数。例如:
List<Foo> findByBarAndGoo(Bar barParam, @optional Goo gooParam);
在这种情况下,此方法必须返回Foo:
bar == barParam && goo == gooParam;
如果gooParam不为null。如果gooParam为null,则条件更改为:
bar == barParam;
有什么解决办法吗?有人能帮我吗?
不确定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 } }
我认为你无法使用方法名称方法来进行查询定义。从文档(参考):
尽管从方法名派生一个查询很方便,但可能会遇到这样一种情况,即方法名解析器不支持一个人想使用的关键字,或者方法名不必要地变得丑陋。因此,你可以通过命名约定使用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);