Spring 具有单个参数的数据 JPA "OR"

Spring Data JPA "OR" with single parameter

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

User findByEmailOrUserName(String usernameOrEmail);

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

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

的方法名称

方法名查询有没有这种可能?

是的,我们可以在这种情况下使用 Or,但您需要检查用户的电子邮件和用户名值是否与电子邮件相同,UserName.for 这东西转到 eclipse,spring 工具套件IDE 您用于编码的是什么,在搜索或快速访问文本框的上部是他们的,键入他们的轮廓并打开您的 pojo class.you 将看到 属性 name email & userName getters 值是多少。

Ex: getuserName();

然后只复制userName就可以了

findByuserNameOremail(String nameOremail);

像这样你必须根据你的 pojo class 吸气剂来做。

假设在你的服务层你有一种方法像

服役中:

@Autowired(required = true)
private IUserRepository idao;

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

存储库中:

User findByuserNameOremail(String name,String email);

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

Using @Query:

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

默认情况下,Spring Data JPA 使用 position-based 参数绑定。


还有,你可以使用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 到 link 相同的 http 参数到存储库方法中的两个参数,这不需要 @Query:

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

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

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

User findByEmailOrUserName(String email, String username);

并且您的服务方法调用存储库应该是;

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

在 Java 8 及更高版本中实际上有一个解决方法,您的 repo 可能如下所示:

    User findByEmailOrUserName(String username, String email);

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