es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

MyBatis devuelve tanto emptyList() como null.

Aquí está mi solicitud de myBatis que debería devolver una lista:

@Mapper
public interface ClientAccessMapper {
List findByClientAndPartnerWithAutoRenewal(@Param(“clientId”) Long clientId,
@Param(“partner”) String partner,
@Param(“autoRenewal”) Boolean autoRenewal);
}

A veces la solicitud devuelve “null” en lugar de una lista vacía.
Después de obtenerla tengo un bloque de comprobación:

final List clientAccesses = clientAccessMapper.findByClientAndPartnerWithAutoRenewal(client, partner, true);
if (clientAccesses.isEmpty()) {/**/}

y mi clientAccesses.isEmpty() a VECES produce una NPE debido a null en lugar de una lista con tamaño 0.
¿Qué puede ser un problema?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema podría ser que el método findByClientAndPartnerWithAutoRenewal está devolviendo nulo en lugar de una lista vacía cuando no hay resultados que coincidan con los criterios de la consulta. Esto podría ocurrir si el mapper de MyBatis no maneja correctamente los valores nulos o si hay un problema con la conexión a la base de datos. Para solucionarlo, puedes modificar el método para devolver una lista vacía en lugar de nulo utilizando el siguiente código:

    @Mapper
    public interface ClienteAccessMapper {
        default List<clientaccess> findByClientAndPartnerWithAutoRenewal(Long clientId, String partner, Boolean autoRenewal) {
            List<clientaccess> clientAccesses = getAccesses(clientId, partner, autoRenewal);
            return clientAccesses != null ? clientAccesses : Collections.emptyList();
        }
    
        @Select("select * from client_access where client_id = #{clientId} and partner = #{partner} <if test="\"autoRenewal" !="null\"">and auto_renewal = #{autoRenewal}</if> order by id")
        @ResultMap("ClientAccessResult")
        List<clientaccess> getAccesses(@Param("clientId") Long clientId, @Param("partner") String partner, @Param("autoRenewal") Boolean autoRenewal);
    }
    

    En este código, agregamos una implementación predeterminada a la interfaz que llama a un nuevo método getAccesses y devuelve una lista vacía si el resultado es nulo. El método getAccesses contiene la definición de consulta original, con las modificaciones para incluir una anotación adicional @Select para evitar depender completamente de XML para el mapeo.

Comments are closed.