wake-up-neo.com

Ruhezustand-Kriterien-Abfrage, um bestimmte Spalten zu erhalten

Ich benutze die Kriterienabfrage in meinem Code. Es feuert immer select * from ...

Stattdessen möchte ich eine Spalte (Feld) aus meiner Abfrage vernachlässigen, da in diesem Feld viele Daten in Byte gespeichert sind. Und das verursacht Leistungsprobleme.

Kann jemand eine Idee dafür geben?


Einige Updates

Ich habe meiner Projektion eine Projektion hinzugefügt, und es wurde eine Abfrage erstellt wie ...

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 ?

Und jetzt ist das Problem wie .. Unknown column 'y4_' in 'where clause' Und derselbe Fehler für y8_, y5_ bedeutet für alle, bei denen es einen Fehler gab.

Ich habe es zu Query geändert wie ...

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 ?

und es hat funktioniert. Aber ich weiß nicht, wie ich es in HQL ändern kann?

44
Ketan

Verwenden Sie Projections , um anzugeben, welche Spalten Sie zurückgeben möchten.

Beispiel

SQL-Abfrage 

SELECT user.id, user.name FROM user;

Alternative zum Ruhezustand

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();
92
Hemant Metalia

Sie können sowohl JPQL als auch die JPA Criteria API für jede Art von DTO-Projektion verwenden (nur ausgewählte Spalten einer DTO-Klasse zuordnen). Sehen Sie sich die folgenden Codeausschnitte an, um zu zeigen, wie Sie verschiedene Spalten selektiv auswählen können, anstatt alle Spalten auszuwählen. In diesem Beispiel wird auch gezeigt, wie verschiedene Spalten aus Ausgewählt werden, die mehrere Spalten verbinden. Ich hoffe das hilft . 

JPQL-Code: 

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-Kriterien-API-Code: 

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

    }
1
Vaneet Kataria

Sie können eine andere Entität basierend auf dieser Klasse zuordnen (Sie sollten Entity-Name verwenden, um die beiden zu unterscheiden), und die zweite wird eine Art dto sein (vergessen Sie nicht, dass dto Designprobleme hat ). Sie sollten das zweite als schreibgeschützt definieren und ihm einen guten Namen geben, um klar zu sein, dass dies keine reguläre Entität ist. Übrigens: Wählen Sie nur wenige Spalten aus, wird als Projektion bezeichnet. Google wird damit einfacher.

alternativ - Sie können eine benannte Abfrage mit der Liste der Felder erstellen, die Sie benötigen (Sie setzen sie in das Auswahlfeld), oder Sie verwenden Kriterien für die Projektion

0