简体   繁体   中英

Select few among all the nested entities : SPRING JPA

I have a scenario like below.

Lets say EntityA has three nested entities EntityB, EntityC, EntityD . And all of EntityB, EntityC, EntityD has several nested entities inside them.

But while selecting for EntityA it selects the whole tree of nested entities. Whereas I want to fetch a specific branch. Lets say only EntityA, EntityB and all sub entities of EntityB are to be fetched leaving EntityC and EntityD back then I am not sure how to do that. As spring jpa brings all the nested objects back to me.

I am using below collection mapping.


 @Entity
 @Table(name = "customer_party_mapping")
 @Data
 public class CustomerPartyMappingEntity {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;
    
    @Column(name = "customer_id")
    private Integer custmerId;
    
    @Column(name = "orgtype_id")
    private Integer orgTypeId;
    
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL )
    @JoinColumn(name = "customer_party_mapping_id")
    @Fetch(value = FetchMode.SUBSELECT)
    private List<CustomerPartyBookingLocationEntity> customerPartyBookingLocation=new ArrayList<CustomerPartyBookingLocationEntity>();
    
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL )
    @JoinColumn(name = "customer_party_mapping_id")
    @Fetch(value = FetchMode.SUBSELECT)
    private List<CustomerPartyFieldMappingEntity> customerPartyFieldMappingEntity=new ArrayList<CustomerPartyFieldMappingEntity>();

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL )
    @JoinColumn(name = "customer_party_mapping_id",referencedColumnName="id")
    @Fetch(value = FetchMode.SUBSELECT)
    private List<CustomerPartyOtherDocumentEntity> otherDocumentsList=new 
    ArrayList<>();
    
    @OneToOne( cascade={ CascadeType.PERSIST, CascadeType.MERGE })
    @JoinColumn(name = "customer_name_screening_id", referencedColumnName="id") 
    private CustomerNameScreeningEntity customerNameScreeningEntity;
        
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL )
    @JoinColumn(name = "customer_party_mapping_id")
    @Fetch(value = FetchMode.SUBSELECT)
    private List<CustomerDocInfoTrackingEntity> customerDocInfoTrackingList=new 
    ArrayList<CustomerDocInfoTrackingEntity>();
}

And I am calling


List<CustomerPartyMappingEntity> customerPartyMappingEntityList = customerPartyMappingRepository.findByCustmerId(customerid);

It gets all the nested mapped list of entities wheras I need only CustomerPartyMappingEntity and its list of customerPartyFieldMappingEntity nested object.

Any help will be appreciated.

First use FetchType.LAZY for nested entity. Then you can use @EntityGraph to fetch nested entity by name and their nested entity using their name with . in the repository. You use to just specify the nested property in attributePaths like

@EntityGraph(attributePaths = {"customerPartyBookingLocation"})

And the nested property of customerPartyBookingLocation like

@EntityGraph(attributePaths = {"customerPartyFieldMappingEntity.subField"})

Example:

@EntityGraph(attributePaths = {"customerPartyBookingLocation", "customerPartyFieldMappingEntity.subField"})
List<CustomerPartyMappingEntity> findByCustmerId(Integer customerid);

Note: You can't use @EntityGraph with @Query annotation

If your entities are really setup correctly, see for instance the subselect example here and remove your EAGER (you are currently instructing hibernate to fetch all these fields upon entity initialization). It should work.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM