首页 > 解决方案 > Spring FirestoreReactiveRepository custom query is not working - Java

问题描述

I am trying to build some custom queries like the documentation is saying, but it is not working.

I got stuck in what i think is the block method and not any data is retrieved.

Here is my repo class:

@Repository
public interface UserRepository extends FirestoreReactiveRepository<User> {

    Flux<User> findByCPF(String CPF);
    Flux<User> findByEmail(String email);
}

and here is the model:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Document(collectionName = "userCollection")
public class User extends BaseEntity {


    @NotNull(message = "{validation.notnull.user.name}")
    private String name;

    @Email
    @NotNull(message = "{validation.notnull.user.email}")
    private String email;

    @NotNull(message = "{validation.notnull.user.password}")
    private String password;

    @NotNull(message = "{validation.notnull.user.address}")
    private String address;

    @CPF
    @NotNull(message = "{validation.notnull.user.cpf}")
    private String CPF;

    @NotNull(message = "{validation.notnull.user.birthDate}")
    private Date birthDate;

    @NotNull(message = "{validation.notnull.user.role}")
    private UserRoleEnum role;
}

this is the method that i'm building that i get stuck:

    @Override
    public Mono<User> create(User entity) {
        var cpf = userRepository.findByCPF(entity.getCPF());
        var email =  userRepository.findByEmail(entity.getEmail());
        
        if(cpf == null || email == null)
           throw new EntityExistException();
       else
        return super.create(entity);
    }

Yeah, it's an override because i have a generic service class:

public class GenericService<T>{

    private FirestoreReactiveRepository<T> firestoreReactiveRepository;

    public GenericService(FirestoreReactiveRepository<T> firestoreReactiveRepository){
        this.firestoreReactiveRepository = firestoreReactiveRepository;
    }

    @Transactional
    public Mono<T> create(T entity){
        return firestoreReactiveRepository.save(entity);
    }

**** HIDED CONTENT *****

Do you know how custom queries can be built with this FirestoreReactiveRepository ?

标签: javaspringspring-bootgoogle-cloud-firestorespring-repositories

解决方案


有哪些类型:

var cpf = userRepository.findByCPF(entity.getCPF());
var email = userRepository.findByEmail(entity.getEmail());

?

你也可以这样写:

Flux<User> cpf = userRepository.findByCPF(entity.getCPF());
Flux<User> email = userRepository.findByEmail(entity.getEmail());

我看到三个问题:

  1. 你不订阅cpfemail通量
  2. if 里面的条件总是假的,因为两个通量都不为空
 if(cpf == null || email == null)
  1. ...假设cpf并且email不会,Flux<User>User我认为条件应该是cpf != null || email != null

代码可能看起来更像这样:

    @Override
    public Mono<User> create(User entity) {
        var cpf = userRepository.findByCPF(entity.getCPF()); // Flux<User> cpf = ...
        var email = userRepository.findByEmail(entity.getEmail()); // Flux<User> email = ...

        return cpf.mergeWith(email)
                .<User>handle((user, sink) -> sink.error(new EntityExistException()))
                .switchIfEmpty(super.create(entity))
                .next();
    }

推荐阅读