Uso Fundamental de QueryDsl con JPA para Consultas y Operaciones

  1. Consultas

Manejo de Campos Complejos: Se utilizan expresioens como Expressions.

Campos Condicionales: Emplean NumberExpression o StringExpression.

  • Igualdad: equal o eq
  • Desigualdad: not equal o ne
  • Menor que: less than o lt
  • Mayor que: greater than o gt
  • Manor o igual: less than or equal o loe
  • Mayor o igual: greater than or equal o goe

Consultas Dinámicas

class OrdenDTO {
    @QueryProjection
    public OrdenDTO(long idOrden, String descripcion) {
        // Constructor para proyección
    }
}

List<OrdenDTO> listaOrdenes = consulta.select(new QOrdenDTO(orden.id, orden.desc))
                                      .from(orden).fetch();

Subconsultas

QProducto producto = QProducto.producto;
QProducto productoSecundario = new QProducto("prod_sec");
fabricaConsultas.select(producto.all())
    .from(producto)
    .where(producto.stock.eq(
        SQLExpressions.select(productoSecundario.stock.max()).from(productoSecundario)))
    .fetch();

Consultas Avanzadas

NumberExpression<Long> idReporte = new CaseBuilder()
        .when(reporte.idProyecto.isNull()).then(reporte.idGrupo)
        .otherwise(reporte.idProyecto);

StringExpression tipoEntidad = new CaseBuilder()
        .when(reporte.idProyecto.isNull()).then("Proyecto Interno")
        .otherwise("Proyecto Externo");

fabricaConsultas.select(Projections.constructor(DetalleCreacion.class,
                Expressions.constant("Estrategia de Cliente"),
                actividad.fecha.year(),
                actividad.fecha.month(),
                actividad.fecha.dayOfMonth(),
                actividad.usuario,
                actividad.nombreUsuario,
                Expressions.constant(String.format("(%s)%s", actividad.codigoCliente, actividad.nombreCliente)),
                actividad.item_id.stringValue(),
                actividad.nota,
                actividad.codigoCliente,
                actividad.tipoZona,
                idReporte,
                tipoEntidad,
                actividad.fecha,
                actividad.id,
                actividad.fechaCreacion
        )).from(actividad).where(condicion).fetch();

Números de Fila

fabricaConsultas.select(SQLExpressions.rowNumber()
        .over()
        .partitionBy(estudiante.nombre)
        .orderBy(estudiante.id))
    .from(estudiante);

  1. Actualización

1  fabricaConsultas.update(qInventario)
2                  .set(qInventario.activo, true)
3                  .set(qInventario.fecha_activacion, UtilFecha.aFechaSistema(System.currentTimeMillis()))
4                  .where(qInventario.codigo.eq(mensaje))
5                  .execute();

  1. Eliminación

1    fabricaConsultas.delete(qInventario)
2                   .where(qInventario.codigo.eq(mensaje))
3                   .execute();

Etiquetas: QueryDsl JPA java SQL Consultas Dinámicas

Publicado el 8-2 17:43