Spring Data JPA“OR”带有单个参数

时间:2016-05-31 21:10:42

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

是否可以使用这样的Spring Data JPA存储库方法:

User findByEmailOrUserName(String usernameOrEmail);

上面的方法名称不起作用,因为Spring Data JPA在尝试查找需要绑定到方法中第二个属性名称的第二个参数时抛出异常。

我想要一个转换为select t from User t where t.email = :usernameOrEmail OR t.userName = :usernameOrEmail

的方法名称

方法名称查询是否有这种可能性?

6 个答案:

答案 0 :(得分:2)

使用最新版本的Spring Data JPA(v1.10.2),这是不可能的。我也没有看到对未来版本的任何此类请求。

答案 1 :(得分:0)

是的,我们可以使用Or来处理这种情况,但您需要检查用户是否电子邮件和用户名值与Email& UserName.for这个东西去了eclipse,spring工具套件你用于编码的 IDE ,在搜索或快速访问文本框的上部是他们的类型概述他们并打开你的pojo class.you将查看属性名称​​电子邮件& userName getter的值是什么。

  

Ex:getuserName();

然后只复制userName,你可以把它放在

  

findByuserNameOremail(String nameOremail);

像这样,你必须根据你的pojo类getter做。

答案 2 :(得分:0)

假设您的服务层中有一个方法,例如

在服务中:

@Autowired(required = true)
private IUserRepository idao;

User getByNameOrMail(String name,String email)
{
 idao.findByuserNameOremail(name,email)
}

在存储库中:

User findByuserNameOremail(String name,String email);

答案 3 :(得分:0)

Using @Query

@Query("select t from User t where t.email = ?1 OR t.userName = ?1")
User findByEmailOrUserName(String usernameOrEmail);

默认情况下,Spring Data JPA使用基于位置的参数绑定。

,您可以使用Named Parameters为方法参数指定具体名称并在查询中绑定名称:

@Query("select t from User t where t.email = :usernameOrEmail OR t.userName = :usernameOrEmail")
User findByEmailOrUserName(@Param("usernameOrEmail") String usernameOrEmail);

作为解决方法,如果您使用Spring Data REST并且您只想在请求中发送单个http参数,则可以使用@Param链接相同的参数存储库方法中的两个参数的http参数,这样就可以完成这个操作而不需要@Query

User findByEmailOrUserName(
        @Param("usernameOrEmail") String email, 
        @Param("usernameOrEmail") String username);

答案 4 :(得分:0)

有可能需要为两个参数编写一个存储库方法,并为两个参数使用相同的值调用此方法。您不需要编写显式的SQL命令。

您的存储库接口应该这样实现;

User findByEmailOrUserName(String email, String username);

您的服务方法调用存储库应为;

public User getUserByEmailOrUsername(String usernameOrEmail) {
    return repository.findByEmailOrUserName(usernameOrEmail, usernameOrEmail);
}

答案 5 :(得分:0)

在Java 8和更高版本中,实际上有一种解决方法,您的存储库可能类似于:

    User findByEmailOrUserName(String username, String email);

    default User findByEmailOrUserName(String usernameOrEmail) {
        return findByEmailOrUserName(usernameOrEmail, usernameOrEmail);
    }