Saltar al contenido

Hibernate Criteria Query para obtener columnas específicas

Siéntete libre de divulgar nuestros tutoriales y códigos con otro, apóyanos para aumentar esta comunidad.

Solución:

Use Proyecciones para especificar qué columnas le gustaría devolver.

Ejemplo

Consulta SQL

SELECT user.id, user.name FROM user;

Alternativa de hibernación

Criteria cr = session.createCriteria(User.class)
    .setProjection(Projections.projectionList()
      .add(Projections.property("id"), "id")
      .add(Projections.property("Name"), "Name"))
    .setResultTransformer(Transformers.aliasToBean(User.class));

  List list = cr.list();

Puede usar JPQL, así como la API de criterios JPA para cualquier tipo de proyección DTO (asignación de solo columnas seleccionadas a una clase DTO). Mire los fragmentos de código a continuación que muestran cómo seleccionar selectivamente varias columnas en lugar de seleccionar todas las columnas. Estos ejemplos también muestran cómo seleccionar varias columnas para unir varias columnas. Espero que esto ayude .

Código JPQL:

String dtoProjection = "new com.katariasoft.technologies.jpaHibernate.college.data.dto.InstructorDto"
                + "(i.id, i.name, i.fatherName, i.address, id.proofNo, "
                + " v.vehicleNumber, v.vechicleType, s.name, s.fatherName, "
                + " si.name, sv.vehicleNumber , svd.name) ";

        List instructors = queryExecutor.fetchListForJpqlQuery(
                "select " + dtoProjection + " from Instructor i " + " join i.idProof id " + " join i.vehicles v "
                        + " join i.students s " + " join s.instructors si " + " join s.vehicles sv "
                        + " join sv.documents svd " + " where i.id > :id and svd.name in (:names) "
                        + " order by i.id , id.proofNo , v.vehicleNumber , si.name , sv.vehicleNumber , svd.name ",
                CollectionUtils.mapOf("id", 2, "names", Arrays.asList("1", "2")), InstructorDto.class);

        if (Objects.nonNull(instructors))
            instructors.forEach(i -> i.setName("Latest Update"));

        DataPrinters.listDataPrinter.accept(instructors);

Código API de criterios JPA:

@Test
    public void fetchFullDataWithCriteria() 
        CriteriaBuilder cb = criteriaUtils.criteriaBuilder();
        CriteriaQuery cq = cb.createQuery(InstructorDto.class);

        // prepare from expressions
        Root root = cq.from(Instructor.class);
        Join insIdProofJoin = root.join(Instructor_.idProof);
        Join insVehicleJoin = root.join(Instructor_.vehicles);
        Join insStudentJoin = root.join(Instructor_.students);
        Join studentInsJoin = insStudentJoin.join(Student_.instructors);
        Join studentVehicleJoin = insStudentJoin.join(Student_.vehicles);
        Join vehicleDocumentJoin = studentVehicleJoin.join(Vehicle_.documents);

        // prepare select expressions.
        CompoundSelection selection = cb.construct(InstructorDto.class, root.get(Instructor_.id),
                root.get(Instructor_.name), root.get(Instructor_.fatherName), root.get(Instructor_.address),
                insIdProofJoin.get(IdProof_.proofNo), insVehicleJoin.get(Vehicle_.vehicleNumber),
                insVehicleJoin.get(Vehicle_.vechicleType), insStudentJoin.get(Student_.name),
                insStudentJoin.get(Student_.fatherName), studentInsJoin.get(Instructor_.name),
                studentVehicleJoin.get(Vehicle_.vehicleNumber), vehicleDocumentJoin.get(Document_.name));

        // prepare where expressions.
        Predicate instructorIdGreaterThan = cb.greaterThan(root.get(Instructor_.id), 2);
        Predicate documentNameIn = cb.in(vehicleDocumentJoin.get(Document_.name)).value("1").value("2");
        Predicate where = cb.and(instructorIdGreaterThan, documentNameIn);

        // prepare orderBy expressions.
        List orderBy = Arrays.asList(cb.asc(root.get(Instructor_.id)),
                cb.asc(insIdProofJoin.get(IdProof_.proofNo)), cb.asc(insVehicleJoin.get(Vehicle_.vehicleNumber)),
                cb.asc(studentInsJoin.get(Instructor_.name)), cb.asc(studentVehicleJoin.get(Vehicle_.vehicleNumber)),
                cb.asc(vehicleDocumentJoin.get(Document_.name)));

        // prepare query
        cq.select(selection).where(where).orderBy(orderBy);
        DataPrinters.listDataPrinter.accept(queryExecutor.fetchListForCriteriaQuery(cq));

    

Puntuaciones y comentarios

Si haces scroll puedes encontrar las anotaciones de otros creadores, tú también puedes insertar el tuyo si te gusta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *