HouseholdRepository.java

package uk.gov.dhsc.htbhf.hmrc.repository;

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import uk.gov.dhsc.htbhf.hmrc.entity.Household;

import java.util.Optional;
import java.util.UUID;
import java.util.stream.Stream;

@Repository
public interface HouseholdRepository extends CrudRepository<Household, UUID> {

    /**
     * Return all households containing an adult with the given nino. These are ordered by fileImportNumber in descending order.
     * @param nino The nino to check against
     * @return A stream containing all households found
     */
    @Query("SELECT household FROM Household household INNER JOIN FETCH household.adults adult "
            + "WHERE adult.nino = :nino ORDER BY household.fileImportNumber DESC")
    Stream<Household> findAllHouseholdsByAdultWithNino(@Param("nino") String nino);

    /**
     * Finds a household containing an adult with a matching nino. The household with the highest fileImportNumber
     * (most recent version) is the one returned.
     * @param nino The nino to check against
     * @return An Optional containing a household if found
     */
    @Transactional(readOnly = true)
    default Optional<Household> findHouseholdByAdultWithNino(String nino) {
        Stream<Household> households = findAllHouseholdsByAdultWithNino(nino);
        return households.findFirst();
    }
}