Java >> Java Program >  >> Java

Namngiven Entity Graph Sub-Subgraf

Det enkla svaret är att du inte kan göra detta eftersom, med den nuvarande implementeringen av JPA, skulle du sluta göra två separata frågor och behöva ta itu med de kartesiska produkterna. Någon framtida version av den gemensamma parlamentariska församlingen skulle kunna utökas till att omfatta fler nivåer av subgrafer, men som den ser ut idag gör den inte det. Det finns en JPA SPEC-grupp som arbetar med nästa version av JPA. Skicka gärna in din förfrågan/förslag där.

Här på StockOverflow finns en annan referens till samma fråga.


Du kan skapa enhetsgrafer på flera nivåer med dynamiska enhetsgrafer. Jag använder jpa 2.2 och Hibernate 5.3.7 och jag kan skapa entitetsdiagram och hämta data upp till 3 nivåer. Jag hoppas att detta kommer att fungera för nästa nivå också. Nedan finns kodavsnittet. För mer information och faktisk kod kan du kolla in min github-repo:https://github.com/vaneetkataria/Jpa-Hibernate/blob/master/jdbcToJpaMigration/src/test/java/com/katariasoft/technologies/jpaHibernate/entity/fetch /entitygraph/dynamic/MultiInstructorsDynamicEntityGrpahTests.java

Kodavsnitt :

@SuppressWarnings("unchecked")
    @Test
    @Rollback(false)
    public void fetchInstrctrsIdProofVehiclesStudentsTheirInstructorsVehiclesAndTheirDocuments() {
        doInTransaction(() -> {
            EntityGraph<Instructor> instructorGraph = em.createEntityGraph(Instructor.class);
            instructorGraph.addAttributeNodes(Instructor_.idProof, Instructor_.vehicles);
            Subgraph<Student> studentSubgraph = instructorGraph.addSubgraph(Instructor_.STUDENTS);
            studentSubgraph.addAttributeNodes(Student_.instructors);
            Subgraph<Vehicle> vehicleSubgraph = studentSubgraph.addSubgraph(Student_.VEHICLES);
            vehicleSubgraph.addAttributeNodes(Vehicle_.documents);
            TypedQuery<Instructor> query = em.createQuery("select i from Instructor i ", Instructor.class)
                    .setHint(EntityGraphUtils.FETCH_GRAPH, instructorGraph);
            List<Instructor> instructors = query.getResultList();
            if (Objects.nonNull(instructors))
                instructors.forEach(instructor -> {
                    IdProof idProof = instructor.getIdProof();
                    Set<Vehicle> vehicles = instructor.getVehicles();
                    Set<Student> students = instructor.getStudents();
                    System.out.println(instructor);
                    System.out.println(idProof);
                    if (Objects.nonNull(vehicles))
                        vehicles.forEach(v -> System.out.println(v.getVehicleNumber()));
                    if (Objects.nonNull(students))
                        students.forEach(s -> System.out.println(s.getName()));
                });
        });
    }

Java-tagg