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.