如何使用 jpa spring 找出是不是已经存在电子邮件并向前端发送一些错误消息

Posted

技术标签:

【中文标题】如何使用 jpa spring 找出是不是已经存在电子邮件并向前端发送一些错误消息【英文标题】:How to find out if an email already exist with jpa spring and sending some error messag to the front end如何使用 jpa spring 找出是否已经存在电子邮件并向前端发送一些错误消息 【发布时间】:2015-12-24 09:32:29 【问题描述】:

所以我有一个简单的UsersDao

public interface UserDao extends JpaRepository<User, Long> 


在我的用户控制器中,我想做这样的事情:

@RequestMapping(value = "/register",method = RequestMethod.POST)
public void addUser(@RequestBody User user) 

    //How do i check if user already exist with email instead of id
    // i managed to do this but can i search on something else than the id
    User user1 = userDao.findOne(1);

    if (user.getEmail().equals(user1.getEmail()))
    

        // And how should i give one error to the front end if the email 
       //already exist I'm using angular js

    
    else 

        userDao.save(user);

    


我还有一些关于这个话题的额外问题:

下面还有一些不清楚的地方。我在 jpa 上做了一个小教程,但他们在那里使用:

实体管理器, 实体交易

注意:使用 EntityManagerFactory 时如下:

    EntityManagerFactory emf = null,

    //Then they use EntityManagerFactory

        emf = Persistence.createEntityManagerFactory("SomeValue")
    //where can i get "someValue" When using application .properties 

//because in the example they use xml but can't find the right properties in application.properties

或者我不需要在springboot中使用这些

抱歉所有这些问题。我真的很想进入春天,但目前还有些不清楚;)

【问题讨论】:

【参考方案1】:

这实际上可以通过两种不同的方式完成。虽然@ufuoma 的解决方案是有效的,但是spring 有更灵活的exists 和Optional。我将给出每个代码示例。 在存储库接口中,我们将有这些方法

boolean existsByEmail(String email);
Optional<User> findByEmail(String email);

然后在您的服务类中我们将拥有

    public Optional<User> findByEmail(String email)
       return baseUserRepository.findByEmail(email);
    

    public boolean exist(String email)
       return baseUserRepository.existsByEmail(email);
    

然后在控制器类中,我们将有

if(baseUserSevice.exists==true)
    return "User already  exist";

Optional<baseUserEntity> user=baseUserService.findByEmail(user.getEmail);
if(user.isPresent())
   return "user already exists";

exist 方法是最受欢迎的,因为它更快

【讨论】:

【参考方案2】:

您可以执行以下操作:

假设User有一个属性email,像这样在接口中定义一个方法来生成动态查询:

public interface UserDao extends JpaRepository<User, Long> 
    public User findByEmail(String email);

然后您可以通过电子邮件找到用户。如果返回null,则不存在具有给定电子邮件的用户。此外,在User 实体类中,您可以定义一个注解以确保email 是唯一的,如下所示:

public class User 

    ....

    @Column(unique=true)
    String email;


【讨论】:

您好,我尝试了您所说的,但 @column unique true 不起作用,我仍然可以通过电子邮件添加多个用户。并且由于某种原因,如果我做类似 User user1 = userDao.findByEmail(user.getEmail()); if(user1.getEmail().equals(user.getEmail())) 我得到 NullPointerException 任何想法如何处理这个 好的,我知道了,但由于某种原因 unique=true 不起作用,我必须在数据库中捕获它 对于 NullPointerException,在检查电子邮件是否相等之前检查 user1 是否为空。 @Column 注释是用于生成 ddl 的指令。如果您没有自动生成 ddl,那么它将无法正常工作。【参考方案3】:

你有两个选择:

    在存储库接口中使用方法User findByEmail(String email);。 使用方法如 @Query("SELECT COUNT(u.id) FROM User u WHERE u.email=:email) Long countUsersWithEmail(String email); 很明显如何使用这些查询的结果。由于开销较小,我会使用第二选择。

【讨论】:

技术上存在竞争条件。最好尝试通过电子邮件保存用户并捕获唯一密钥违规 findUserByEmail 将抛出 NonUniqueResultException 异常,如果该电子邮件已经存在

以上是关于如何使用 jpa spring 找出是不是已经存在电子邮件并向前端发送一些错误消息的主要内容,如果未能解决你的问题,请参考以下文章

如何知道一个分离的 JPA 实体是不是已经被持久化?

spring cloud 搭建(多JPA,JPA分页)

关于如何使用 jpa-repositiroies 在 Spring-Boot 上持久保存数据的指南/教程

spring data jpa:插入而不是删除

playframework 1.2.4 如何将 jar 与已经存在的 JPA 实体一起使用

spring jpa使用@service注解时失效该如何解决?