I've read Spring Data JPARepository: How to conditionally fetch children entites . But I want to use convenient JPA annotations rather than manual join all children.
Say I have the following Model:
@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<>();
}
Fetching credentialList
and actionList
can be a time consuming operation (join fetches, etc). I do not want to auto fetch credentialList
nor actionList
. But when I access them, I expect them to be an empty List rather than LazyInitializationException
.
Can I use the fields even when I did not specifically JOIN FETCH
them in @Query
. Just leave it to be an empty list.
If not, Is there anyway to achieve same needs?
Returning empty Collections would lead to a problem: You couldn't distinguish between a really empty collection and one, that just isn't lazily loaded. You could check for the collections before accessing them through org.hibernate.Hibernate.isInitialized(...)
or PersistenceUnitUtil#isLoaded(...)
in JPA2.
However I would suggest you to use Data-Transfer-Objects at this point. For the special use-case, where the collections are not needed, just build a similiar copy of your entity without that unnesseccary properties. Of course your DTO building must be done within an open session.
I think you are trying to do JOIN but not FETCH, may be just using child objects' attributes in where condition. I wonder something like this will work in JPQL.
@Query("Select u from UserModel u INNER JOIN u.credentialList c
INNER JOIN u.actionList a")
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.