英文:
Select few among all the nested entities : SPRING JPA
问题
I understand that you want to retrieve only the CustomerPartyMappingEntity and its list of customerPartyFieldMappingEntity nested objects from your code. You can achieve this by modifying your query. Here's a suggestion:
List<CustomerPartyMappingEntity> customerPartyMappingEntityList = customerPartyMappingRepository.findCustomerPartyMappingWithFields(customerid);
Then, in your repository interface, define a custom query method like this:
public interface CustomerPartyMappingRepository extends JpaRepository<CustomerPartyMappingEntity, Integer> {
@Query("SELECT DISTINCT cpm FROM CustomerPartyMappingEntity cpm LEFT JOIN FETCH cpm.customerPartyFieldMappingEntity WHERE cpm.custmerId = :customerId")
List<CustomerPartyMappingEntity> findCustomerPartyMappingWithFields(@Param("customerId") Integer customerId);
}
This custom query uses a LEFT JOIN FETCH clause to load only the CustomerPartyMappingEntity and its list of customerPartyFieldMappingEntity nested objects, excluding the other nested entities.
Make sure to adjust the query method and entity names as per your actual code structure.
英文:
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.
答案1
得分: 11
首先,对于嵌套实体,可以使用 FetchType.LAZY。
然后,您可以使用 @EntityGraph 来按名称获取嵌套实体,以及使用它们的名称和 . 在存储库中获取它们的嵌套实体。您只需在 attributePaths 中指定嵌套属性,如下所示:
@EntityGraph(attributePaths = {"customerPartyBookingLocation"})
以及 customerPartyBookingLocation 的嵌套属性,如下所示:
@EntityGraph(attributePaths = {"customerPartyFieldMappingEntity.subField"})
示例:
@EntityGraph(attributePaths = {"customerPartyBookingLocation", "customerPartyFieldMappingEntity.subField"})
List<CustomerPartyMappingEntity> findByCustomerId(Integer customerId);
注意: 无法在 @Query 注解中使用 @EntityGraph。
英文:
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
答案2
得分: 0
如果你的实体确实已正确设置,例如请查看子选择示例此处,并移除EAGER(目前您正在指示Hibernate在实体初始化时获取所有这些字段)。它应该会起作用。
英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论