![](/img/trans.png)
[英]Spring Data JPARepository: How to conditionally fetch children entites
[英]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<>();
}
獲取credentialList
和actionList
可能是一項耗時的操作(連接提取等)。 我不想自動獲取credentialList
和actionList
。 但是當我訪問它們時,我希望它們是一個空的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.