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),这是不可能的。我也没有看到对未来版本的任何此类请求。
@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);
}
是否可以有这样的 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),这是不可能的。我也没有看到对未来版本的任何此类请求。
@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);
}