簡體   English   中英

Spring Data有條件地獲取子項

[英]Spring Data conditionally fetch children

我讀過Spring Data JPARepository:如何有條件地獲取孩子們的誘惑 但我想使用方便的JPA注釋而不是手動加入所有孩子。

說我有以下型號:

@Entity
public class UserModel extends BaseModel<User> {

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<CredentialModel> credentialList = new ArrayList<>();

    @ManyToMany
    @JoinTable(
            name = "users_actions",
            joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "action_id", referencedColumnName = "id")
    )
    private List<ActionMode> actionList = new ArrayList<>();
}

獲取credentialListactionList可能是一項耗時的操作(連接提取等)。 我不想自動獲取credentialListactionList 但是當我訪問它們時,我希望它們是一個空的List而不是LazyInitializationException

即使我沒有在@Query專門JOIN FETCH ,我也可以使用這些字段。 把它留作一個空列表吧。

如果沒有,無論如何都有相同的需求嗎?

返回空集合會導致一個問題:你無法區分真正空的集合和一個,只是沒有延遲加載。 您可以在通過JPA2中的org.hibernate.Hibernate.isInitialized(...)PersistenceUnitUtil#isLoaded(...)訪問它們之前檢查集合。

但是我建議你在這一點上使用數據傳輸對象。 對於不需要集合的特殊用例,只需構建一個類似的實體副本,而不需要那些不必要的屬性。 當然,您的DTO大樓必須在公開會議中完成。

我認為你正在嘗試JOIN而不是FETCH,可能只是在where條件中使用子對象的屬性。 我想這樣的東西在JPQL中會起作用。

@Query("Select u from UserModel u INNER JOIN u.credentialList c
 INNER JOIN u.actionList a")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM