Выберите несколько из всех вложенных сущностей: SPRING JPA - PullRequest
3 голосов
/ 02 августа 2020

У меня есть сценарий, подобный приведенному ниже.

Допустим, EntityA имеет три вложенных объекта EntityB, EntityC, EntityD. И все EntityB, EntityC, EntityD имеют внутри несколько вложенных сущностей.

Но при выборе для EntityA он выбирает все дерево вложенных сущностей. В то время как я хочу получить конкретную ветку c. Допустим, должны быть извлечены только EntityA, EntityB и все суб-объекты из EntityB, оставив EntityC и EntityD, тогда я не уверен, как это сделать. Поскольку spring jpa возвращает мне все вложенные объекты.

Я использую отображение коллекции ниже.

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

А я звоню

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

Он получает весь вложенный отображенный список объектов, когда мне нужно только CustomerPartyMappingEntity и его список customerPartyFieldMappingEntity вложенных объектов.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

5 голосов
/ 02 августа 2020

Первое использование FetchType.LAZY для вложенной сущности. Затем вы можете использовать @EntityGraph для извлечения вложенных сущностей по имени и их вложенных сущностей, используя их имя с . в репозитории. Вы используете, чтобы просто указать вложенное свойство в attributePaths как

@EntityGraph(attributePaths = {"customerPartyBookingLocation"})

И вложенное свойство customerPartyBookingLocation как

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

Пример:

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

Примечание: Вы не можете использовать @EntityGraph с аннотацией @Query

0 голосов
/ 02 августа 2020

Если ваши сущности действительно настроены правильно, см., Например, пример подзапроса здесь и удалите свой EAGER (в настоящее время вы даете команду спящему режиму получить все эти поля при инициализации сущности). Должно сработать.

...