如果 Spring Data JPA 查询中的参数为空,如何避免 AND 条件

How to avoiding AND condition if parameter is null in Spring Data JPA query

我正在尝试使用 Spring Data JPA 获取一个查询的结果。我在这里发送一些参数并根据它接收结果。

我的存储库查询是,

@Query("select u.username,p.pname from Users u join u.priviJoin p where u.username = :uname AND p.pname = :pname")
List<Users> findByUsername(@Param("uname") String uname , @Param("pname") String pname );

然后像下面这样从控制器调用,

@RequestMapping(value = "/joinResult", method = RequestMethod.GET)
public List<Users> joinResultShow()
    {
        return (List<Users>) userRepo.findByUsername("test_user","testRole");

    }

在这里我们可以看到,如果我传递一些值,那么只根据该参数进行检查。在这里我需要修改我的查询,如果参数为空,则不需要在查询中使用 AND 条件。

如果参数为空,我如何修改此查询以避免 AND 条件?我是 Spring Data JPA 世界的新手。

这里有一些可能的选择
1. 在您的存储库中创建多个方法,例如

  @Query("select u.username,p.pname from Users u join u.priviJoin p where u.username = :uname AND p.pname = :pname")
    List<Users> findByusernamewithRole(@Param("uname") String uname , @Param("pname") String pname );

  @Query("select u.username,p.pname from Users u join u.priviJoin p where u.username = :uname")
    List<Users> findByUsernameWithoutRole(@Param("uname") String uname);
  1. 编写自定义存储库并使用 EntityManager。有了它,您可以使用 CriteriaBuilder 根据您的输入创建动态查询,并在查询中使用此条件。

  2. 在动态输入的情况下(就像您一样),最后也是最首选的选项是 Querydsl。 关于querydsl的一些文章
    http://www.baeldung.com/querydsl-with-jpa-tutorial
    http://www.querydsl.com/static/querydsl/latest/reference/html/ch02.html