Spring Data JPA查询返回null

时间:2017-11-09 07:57:05

标签: java mysql spring-boot spring-data-jpa

  

我的项目基于spring boot,Thymeleaf,mysql,html和Jquery。

我写了一个检查用户名和密码是否有效的查询,如果有效则表示返回TRUE,否则为false ..这是我的方案..但它传递null ...所以它变为nullpointer异常.. 这是我的代码

public interface RepoUserSignup extends JpaRepository<EntUserSignup, Integer> 
{

    @Query("SELECT pk FROM EntUserSignup pk WHERE pk.username=:uname AND pk.password=:pwd")
    Boolean checkUsername(@Param("uname") String username,@Param("pwd") String password);


}

请帮帮我..谢谢提前

3 个答案:

答案 0 :(得分:2)

您的查询返回一个Object而不是布尔值,因此您有两种方法:

  • 您的方法应返回EntUserSignup checkUsername(@Param("uname") String username,@Param("pwd") String password);,然后检查是否有结果
  • 另一种方法是检查结果@Query("SELECT COUNT(pk) > 0 FROM EntUserSignup pk WHERE pk.username=:uname AND pk.password=:pwd")的数量,这样如果有一些结果COUNT(pk) > 0将返回true,否则它将返回false

答案 1 :(得分:1)

用以下方法替换您的方法:

Optional<EntUserSignup> findByUsernameAndPassword(String username, String password);

然后在您的业务层中,您可以执行以下操作:

EntUserSignup user = findByUsernameAndPassword(username, password)
                     .orElseThrow(() -> new UsernameNotFoundException("User not found!"));

因为不要忘记password in plain text ......

Spring Boot应用程序中的一个很好的教程how to implement security ...

答案 2 :(得分:1)

我只是更改了我的返回类型

@Query("SELECT pk FROM EntUserSignup pk WHERE pk.username=:uname AND pk.password=:pwd")
    EntUserSignup checkUsername(@Param("uname") String username,@Param("pwd") String password);

因此,当传递用户名和密码匹配menans时,它将返回实体值,否则返回null。因此我们可以确定没有匹配的用户名和密码。然后我们可以将逻辑编写为

<强> @服务

public Boolean doCheckUserLogin(EntUserSignup user) {
        Boolean result = false;
        try {
            EntUserSignup entResult = repoSignup.checkUsername(user.getUsername(),user.getPassword());
            if(entResult!=null)
            {
                result = true;
            }
            else
            {
                result = false;
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            result = false;
        }
        return result;
    }

这种逻辑非常有效......