Spring Data JPA中使用单个参数的“OR”

7

是否可能拥有这样一个Spring Data JPA存储库方法:

User findByEmailOrUserName(String usernameOrEmail);

上述的方法名称不可用,因为当Spring Data JPA尝试查找需要绑定到方法的第二个参数时,会抛出异常。

我希望有一个方法名称能够转换成select t from User t where t.email = :usernameOrEmail OR t.userName = :usernameOrEmail

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


1
虽然不太优雅,但您可以通过定义repo方法来使用两个参数 User findByEmailOrUserName(String email, String userName); 来获得相同的结果,然后调用者可以将相同的参数传递两次:findByEmailOrUserName("mubin", "mubin")findByEmailOrUserName("mubin@so.com", "mubin@so.com")。这样其他调用者如果需要,实际上可以使用不同的参数调用它。不过,仍然不确定传递重复参数是否是一个好主意。 - Vikas Prasad
1
@Nicolau 谢谢,但这并没有回答问题。我没有使用Spring DATA REST。 - Mubin
1
@Nicolau 请再仔细阅读我的问题。我在询问方法名称查询。你的回答都不符合我的标准。 - Mubin
@Nicolau 那也是我在答案中所说的。 - Mubin
6个回答

6

目前最新版本的Spring Data JPA(v1.10.2)不支持此功能。我也没有看到未来版本中有任何这样的要求。


2

Using @Query:

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

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


此外,您还可以使用命名参数为方法参数指定具体名称,并在查询中绑定该名称:

@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);

1
在Java 8及更高版本中,实际上有一种解决方法,您的存储库可能如下所示:
    User findByEmailOrUserName(String username, String email);

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

-1

假设在你的服务层中有一个方法:

在服务中:

@Autowired(required = true)
private IUserRepository idao;

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

在代码库中:

User findByuserNameOremail(String name,String email);

-1

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

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

User findByEmailOrUserName(String email, String username);

而你的服务方法调用存储库应该是;

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

-2

是的,我们可以在这种情况下使用Or,但您需要在User中检查电子邮件和用户名值是否与Email和UserName相同。为此,请转到您正在用于编码的eclipse、spring工具套件或其他IDE,然后在搜索或快速访问文本框中键入“outline”,打开您的pojo类。您将看到属性名称emailuserName的getter值。

例如:getuserName();

然后只复制userName,并将其放入

findByuserNameOremail(String nameOremail);

根据您的pojo类的getter方法进行类似操作。


1
我已经提到了只有一个参数是不起作用的。你自己测试过吗? - Mubin
只有一个参数是不可能的,但如果有两个参数,那就可以了,因为Spring Data JPA会代表您生成SQL查询。 - Sumeet Tiwari
2
我知道它可以用两个参数实现。问这个问题的整个重点是想知道是否可以只用一个参数来实现。请在回答前仔细阅读问题。 - Mubin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接