尽管从方法名派生查询非常困难
方便的情况下,人们可能面临的情况下,无论是该方法
Name 解析器不支持要使用的关键字或方法
名称会变得不必要的难看
通过变数命名原则查询(请参阅使用 JPA NamedQuery
更多信息)或者更确切地说,用@Query 注释查询方法
我认为您在这里遇到了这种情况,因此下面的答案使用了@Query 注释方法,它几乎与方法名方法(< em > 参考 )一样方便。
@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);
@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") Optional<Goo> goo);
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
}
}
@Query("select new com.ada.bourse.wealth.services.models.response.UserOrdersResponse(FIELDS ARE DELETED TO BECOME MORE READABLE)" +
" from User u join Orders o on u.id = o.user.id where u.userName = :username" +
" and (:orderId is null or o.id = :orderId) and (:flag is null or o.flags = :flag)")
Page<UserOrdersResponse> findUsersOrders(String username, Long orderId, Long flag, Pageable page);
就是这样,你们可以看到我用 (:orderId is null or o.id = :orderId)和 (:flag is null or o.flags = :flag)检查了我的可选参数我认为需要强调的是 我检查了我的论点和 is null条件 不是我的专栏数据所以如果客户端为我发送 Id和 flags参数我会用它们过滤结果否则我只用 username查询也就是我的 @PathVariable。