QueryWrapper: Construcción dinámica de consultas con MyBatis-Plus

Uso del Constructor de Condiciones QueryWrapper

El componente QueryWrapper hereda de AbstractWrapper. Su propiedad interna entity también se utiliza para generar las cláusulas WHERE de las consultas. Para obtener un wrapper basado en Lambda, se puede emplear el método new QueryWrapper().lambda().

Tabla de ejemplo utilizada en las pruebas.

1. Métodos eq y ne

Descripción: eq significa igualdad (=), mientras que ne significa desigualdad (!=).

Ejemplo práctico:

@Test
public void probarIgualdad(){
        QueryWrapper<Producto> envoltorio = new QueryWrapper<>();
        //eq() - Igual a
        envoltorio.eq("nombre", "Pistón Hidráulico");
        Producto articulo = productoServicio.obtenerUno(envoltorio);
        System.out.println(articulo);
}
@Test
public void probarDesigualdad(){
        QueryWrapper<Producto> envoltorio = new QueryWrapper<>();
        //ne() - No igual a
        envoltorio.ne("estado", 0);
        List<Producto> lista = productoServicio.listar(envoltorio);
        System.out.println(lista);
}

2. Métodos gt, ge, lt, le

Descripción: Son operadores de comparación numérica. gt (mayor que), ge (mayor o igual que), lt (menor que), le (menor o igual que).

Ejemplo práctico:

@Test
public void probarComparacionesNumericas(){
        QueryWrapper<Producto> wrapperMayor = new QueryWrapper<>();
        //gt() - Mayor que
        wrapperMayor.gt("precio", 150.00);
        List<Producto> listaMayor = productoServicio.listar(wrapperMayor);
        System.out.println("Productos con precio mayor a 150: " + listaMayor);

        //**********************

        QueryWrapper<Producto> wrapperMenorIgual = new QueryWrapper<>();
        //le() - Menor o igual que
        wrapperMenorIgual.le("stock", 50);
        List<Producto> listaMenorIgual = productoServicio.listar(wrapperMenorIgual);
        System.out.println("Productos con stock igual o menor a 50: " + listaMenorIgual);
}

3. Métodos between y notBetween

Descripción: between seleccciona valores dentro de un rango inclusivo (valor1 y valor2). notBetween selecciona valores fuera de ese rango.

Ejemplo práctico:

@Test
public void probarRangos(){
        QueryWrapper<Producto> wrapperEnRango = new QueryWrapper<>();
        //between() - Dentro del rango [10, 100]
        wrapperEnRango.between("stock", 10, 100);
        List<Producto> listaEnRango = productoServicio.listar(wrapperEnRango);
        System.out.println("Productos con stock entre 10 y 100: " + listaEnRango);

        //**********************

        QueryWrapper<Producto> wrapperFueraRango = new QueryWrapper<>();
        //notBetween() - Fuera del rango [10, 100]
        wrapperFueraRango.notBetween("stock", 10, 100);
        List<Producto> listaFueraRango = productoServicio.listar(wrapperFueraRango);
        System.out.println("Productos con stock fuera de [10,100]: " + listaFueraRango);
}

4. Métodos like, notLike, likeLeft, likeRight

Descripción: Realizan búsquedas difusas. like busca en cualquier posición (%valor%). notLike excluye ese patrón. likeLeft busca al final (%valor) y likeRight busca al inicio (valor%).

Ejemplo práctico:

@Test
public void probarBusquedasDifusas(){
        QueryWrapper<Producto> wrapperContiene = new QueryWrapper<>();
        //like() - Contiene el texto "acero"
        wrapperContiene.like("descripcion", "acero");
        List<Producto> listaContiene = productoServicio.listar(wrapperContiene);
        System.out.println("Productos que contienen 'acero': " + listaContiene);

        //**********************

        QueryWrapper<Producto> wrapperTermina = new QueryWrapper<>();
        //likeRight() - El nombre termina con "T"
        wrapperTermina.likeRight("nombre", "T");
        List<Producto> listaTermina = productoServicio.listar(wrapperTermina);
        System.out.println("Productos cuyo nombre termina en 'T': " + listaTermina);
}

5. Métodos isNull y isNotNull

Descripción: isNull verifica que un campo sea nulo (IS NULL). isNotNull verifica que no sea nulo (IS NOT NULL).

Ejemplo práctico:

@Test
public void probarNulos(){
        QueryWrapper<Producto> wrapperSinImagen = new QueryWrapper<>();
        //isNull() - El campo "url_imagen" es nulo
        wrapperSinImagen.isNull("url_imagen");
        List<Producto> listaSinImagen = productoServicio.listar(wrapperSinImagen);
        System.out.println("Productos sin imagen: " + listaSinImagen);

        //**********************

        QueryWrapper<Producto> wrapperConDescripcion = new QueryWrapper<>();
        //isNotNull() - El campo "descripcion" no es nulo
        wrapperConDescripcion.isNotNull("descripcion");
        List<Producto> listaConDescripcion = productoServicio.listar(wrapperConDescripcion);
        System.out.println("Productos con descripción: " + listaConDescripcion);
}

6. Métodos in y notIn

Descripción: in verifica que el valor del campo esté dentro de una lista de valores proporcionados (IN (v0, v1, ...)). notIn verifica que NO esté en esa lista.

Ejemplo práctico:

@Test
public void probarListasDeValores(){
        QueryWrapper<Producto> wrapperCategorias = new QueryWrapper<>();
        //in() - La categoría debe ser 1, 5 o 9
        wrapperCategorias.in("categoria_id", 1, 5, 9);
        List<Producto> listaCategorias = productoServicio.listar(wrapperCategorias);
        System.out.println("Productos en categorías 1, 5, 9: " + listaCategorias);

        //**********************

        QueryWrapper<Producto> wrapperExcluirIds = new QueryWrapper<>();
        //notIn() - Excluir productos con IDs 101, 205, 300
        wrapperExcluirIds.notIn("id", 101, 205, 300);
        List<Producto> listaExcluidos = productoServicio.listar(wrapperExcluirIds);
        System.out.println("Productos excluyendo IDs 101,205,300: " + listaExcluidos);
}

7. Métodos or y and

Descripción: Definen la lógica combinada de las condiciones. or() conecta la siguiente condición con un OR. Si no se llama explícitamente a or(), las condiciones se conectan por defeccto con AND.

Ejemplo práctico:

@Test
public void probarLogicaOR(){
        QueryWrapper<Producto> wrapperOr = new QueryWrapper<>();
        //or() - Buscar productos con precio > 200 O con stock < 10
        wrapperOr.gt("precio", 200.0).or().lt("stock", 10);
        List<Producto> listaOr = productoServicio.listar(wrapperOr);
        System.out.println("Productos con precio > 200 O stock < 10: " + listaOr);
}
@Test
public void probarLogicaANDImplicita(){
        QueryWrapper<Producto> wrapperAnd = new QueryWrapper<>();
        // Condiciones unidas por AND (comportamiento por defecto)
        // Buscar nombre "Engranaje Estándar" Y categoría 3
        wrapperAnd.eq("nombre", "Engranaje Estándar").eq("categoria_id", 3);
        List<Producto> listaAnd = productoServicio.listar(wrapperAnd);
        System.out.println("Producto 'Engranaje Estándar' en categoría 3: " + listaAnd);
}

8. Métodos orderByAsc y orderByDesc

Descripción: orderByAsc ordena los resultados de forma ascendente por el campo especifciado. orderByDesc ordena de forma descendente.

Ejemplo práctico:

@Test
public void probarOrdenamientos(){
        QueryWrapper<Producto> wrapperOrden = new QueryWrapper<>();
        //orderByAsc() - Ordenar por fecha de creación (ascendente)
        wrapperOrden.orderByAsc("fecha_creacion");
        List<Producto> listaOrdenadaAsc = productoServicio.listar(wrapperOrden);
        System.out.println("Productos ordenados por fecha (antiguo a nuevo):");
        listaOrdenadaAsc.forEach(System.out::println);

        //**********************

        QueryWrapper<Producto> wrapperOrdenDesc = new QueryWrapper<>();
        //orderByDesc() - Ordenar por precio (mayor a menor)
        wrapperOrdenDesc.orderByDesc("precio");
        List<Producto> listaOrdenadaDesc = productoServicio.listar(wrapperOrdenDesc);
        System.out.println("Productos ordenados por precio (mayor a menor):");
        listaOrdenadaDesc.forEach(System.out::println);
}

9. Métodos inSql y notInSql (Uso menos frecuente)

Descripción: Permiten definir la lista de valores mediante una subconsulta SQL directa. inSql equivale a IN (subconsulta), notInSql a NOT IN (subconsulta).

Ejemplo práctico:

@Test
public void probarSubconsultas(){
        QueryWrapper<Producto> wrapperSubConsulta = new QueryWrapper<>();
        //inSql() - Filtrar por IDs obtenidos de otra tabla
        String sqlSubConsulta = "SELECT producto_id FROM inventario WHERE cantidad > 100";
        wrapperSubConsulta.inSql("id", sqlSubConsulta);
        List<Producto> listaSubConsulta = productoServicio.listar(wrapperSubConsulta);
        System.out.println("Productos con alto inventario: " + listaSubConsulta);
}

10. Métodos exists y notExists (Uso menos frecuente)

Descripción: exists agrega la condición EXISTS (subconsulta) a la cláusula WHERE. notExists agrega NOT EXISTS (subconsulta). Son útiles para correlacionar con datos de otras tablas.

Ejemplo práctico:

@Test
public void probarExistencia(){
        QueryWrapper<Producto> wrapperExiste = new QueryWrapper<>();
        //exists() - Verificar si existe un registro relacionado en la tabla de pedidos
        String sqlExistencia = "SELECT 1 FROM pedido_detalle pd WHERE pd.producto_id = id";
        wrapperExiste.exists(sqlExistencia);
        List<Producto> listaExistente = productoServicio.listar(wrapperExiste);
        System.out.println("Productos que han sido pedidos: " + listaExistente);
}

Etiquetas: MyBatis-Plus java ORM QueryWrapper SQL Dinámico

Publicado el 6-4 23:40