繁体   English   中英

带有单个参数的 Spring Data 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

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

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

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

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

    User findByEmailOrUserName(String username, String email);

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

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

在役:

@Autowired(required = true)
private IUserRepository idao;

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

在存储库中:

User findByuserNameOremail(String name,String email);

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

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

User findByEmailOrUserName(String email, String username);

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

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

是的,我们可以使用 Or 在这种情况下,但您需要检查用户的电子邮件和用户名值是否与电子邮件和用户名相同。对于这件事,请转到 eclipse,spring 工具套件,无论您使用什么IDE进行编码和在上层在搜索或快速访问文本框中是他们的,输入大纲他们并打开你的 pojo 类。你会看到属性名称电子邮件用户名是什么 getter 值。

例如:getuserName();

然后只复制用户名,你就可以把它

findByuserNameOremail(String nameOremail);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM