Hibernate Criterios de Consulta para obtener columnas específicas

Estoy utilizando Criterios de Consulta en mi código. Siempre incendios select * from ...

Lugar quiero descuidar una columna(campo) de mi consulta como que el campo tiene un gran número de datos almacenados en bytes. Y que causan problemas de rendimiento.

Puede dar una idea para que?


Algunos De Actualización

He añadido una proyección en mi consulta y se creó una consulta como…

select
    this_.TEMPLATE_ID as y0_,
    this_.TEMPLATE_NAME as y1_,
    this_.CREATE_DATE as y2_,
    this_.UPDATE_DATE as y3_,
    this_.STATUS_CODE as y4_,
    this_.USER_ID as y5_,
    this_.UPDATED_BY as y6_,
    this_.CATEGORY_ID as y7_,
    this_.PRACTICE_ID as y8_ 
from
    templates this_ 
inner join
    user user1_ 
        on this_.USER_ID=user1_.USER_ID 
inner join
    template_categories category2_ 
        on this_.CATEGORY_ID=category2_.CATEGORY_ID 
where
    y4_=? 
    and y8_=? 
    and y5_ in (
        ?, ?
    ) 
order by
    y1_ asc limit ?

Y ahora el problema es como.. Unknown column 'y4_' in 'where clause'
y el mismo error para y8_ , y5_ significa para todos, donde cerca de daba un error.

La he modificado para Consulta como …

select
    this_.TEMPLATE_ID as y0_,
    this_.TEMPLATE_NAME as y1_,
    this_.CREATE_DATE as y2_,
    this_.UPDATE_DATE as y3_,
    this_.STATUS_CODE as y4_,
    this_.USER_ID as y5_,
    this_.UPDATED_BY as y6_,
    this_.CATEGORY_ID as y7_,
    this_.PRACTICE_ID as y8_ 
from
    templates this_ 
inner join
    user user1_ 
        on this_.USER_ID=user1_.USER_ID 
inner join
    template_categories category2_ 
        on this_.CATEGORY_ID=category2_.CATEGORY_ID 
where
    this_.STATUS_CODE=1
    and this_.PRACTICE_ID=1 
    and this_.USER_ID in (
        1, 2
    ) 
order by
    y1_ asc limit ?

y funcionó. Pero no sé cómo modificarlo en HQL?

InformationsquelleAutor Ketan | 2012-07-24

3 Kommentare

  1. 96

    Uso Proyecciones para especificar las columnas que desea devolver.

    Ejemplo

    Consulta SQL

    SELECT user.id, user.name FROM user;

    Hibernate Alternativa

    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<User> list = cr.list();
  2. 2

    Puede utilizar JPQL así como JPA Criterios API para cualquier tipo de DTO proyección(Mapping sólo las columnas seleccionadas para una clase DTO) . Mira a continuación los fragmentos de código que muestra cómo selectivamente seleccionar varias columnas, en lugar de
    seleccionar todas las columnas . Este ejemplo también muestra cómo seleccionar varias columnas de
    unión de múltiples columnas . Espero que esto ayude .

    JPQL código :

    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<InstructorDto> 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);

    JPA Criterios del código de la API :

    @Test
        public void fetchFullDataWithCriteria() {
            CriteriaBuilder cb = criteriaUtils.criteriaBuilder();
            CriteriaQuery<InstructorDto> cq = cb.createQuery(InstructorDto.class);
    
            //prepare from expressions
            Root<Instructor> root = cq.from(Instructor.class);
            Join<Instructor, IdProof> insIdProofJoin = root.join(Instructor_.idProof);
            Join<Instructor, Vehicle> insVehicleJoin = root.join(Instructor_.vehicles);
            Join<Instructor, Student> insStudentJoin = root.join(Instructor_.students);
            Join<Student, Instructor> studentInsJoin = insStudentJoin.join(Student_.instructors);
            Join<Student, Vehicle> studentVehicleJoin = insStudentJoin.join(Student_.vehicles);
            Join<Vehicle, Document> vehicleDocumentJoin = studentVehicleJoin.join(Vehicle_.documents);
    
            //prepare select expressions.
            CompoundSelection<InstructorDto> 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<Order> 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));
    
        }
  3. 0

    Puede asignar a otra entidad, basado en esta clase (hay que utilizar el nombre-entidad con el fin de distinguir los dos) y el segundo será el tipo de dto (no hay que olvidar que dto tiene problemas de diseño ).
    debe definir el segundo como readonly y darle un buen nombre a fin de tener en claro que este no es un habitual de la entidad.
    por la forma de seleccionar sólo algunas columnas se llama proyección , por lo que google va a ser más fácil.

    alternativa – puede crear una consulta con nombre con la lista de campos que necesita (se les pone en el select ) o el uso de los criterios con proyección

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea