无法转换为java.base / java.util.Optional?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (309)

我想使用Spring和Angular实现用户身份验证。我试过这个:

    @PostMapping("request")
    public ResponseEntity<?> resetRequest(@RequestBody PasswordResetDTO resetDTO) {
        return userRepository.findByUsername(resetDTO.getName()).map(user -> {

            if (!user.getEmail().equals(resetDTO.getEmail())) {
                return new ResponseEntity<>("NAME_AND_EMAIL_MISMATCH", HttpStatus.BAD_REQUEST);
            }

            resetHandler.sendResetMail(user);

            return ok(resetDTO);
        })
                .orElseGet(() -> notFound().build());
    }

接口:

public interface UserRepository extends CrudRepository<Users, Integer> {
    Optional<Users> findByUsername(String username);

    Optional<Users> findByEmail(String email);

    Optional<Users> findByResetCode(String code);
}

IMPL:

    @Override
    public Optional<Users> findByUsername(String username) {
        String hql = "select e from " + Users.class.getName() + " e where e.login = ?";
        Query query = entityManager.createQuery(hql).setParameter(0, username);
        Optional<Users> users = (Optional<Users>) query.getSingleResult();
        return users;
    }

但我明白了 Users cannot be cast to java.base/java.util.Optional

实现这个的正确方法是什么?我应该使用Optional还是应该使用null check?

提问于
用户回答回答于

首先,如JB Nizet建议,使用类型查询。第二次使用getResultList,如果你不知道,如果DB永远有您的查询的记录(因为你使用另购的你可能不)。

这里更新findByUsername

@Override
public Optional<Users> findByUsername(String username) {
    String hql = "select e from " + Users.class.getName() + " e where e.login = ?";
    TypedQuery<Users> query = entityManager.createQuery(hql, Users.class).setParameter(0, username);
    List<Users> users = query.getResultList();
    return users.isEmpty() ? Optional.empty() : Optional.of( users.get(0) );
}

扫码关注云+社区

领取腾讯云代金券