He leído Spring Data JPARepository: Cómo recuperar condicionalmente las entidades de los niños . Pero quiero usar anotaciones JPA convenientes en lugar de unir manualmente a todos los niños.
Digamos que tengo el siguiente modelo:
@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<>(); }
Obtener credentialList
y actionList
puede ser una operación que requiere mucho tiempo (obtenciones de unión, etc.). No quiero obtener automáticamente credentialList
ni actionList
. Pero cuando accedo a ellos, espero que sean una Lista vacía en lugar de LazyInitializationException
.
¿Puedo usar los campos incluso cuando no los JOIN FETCH
específicamente en @Query
. Solo deja que sea una lista vacía.
Si no, ¿hay alguna forma de lograr las mismas necesidades?
Devolver colecciones vacías generaría un problema: no podría distinguir entre una colección realmente vacía y una que simplemente no está cargada de forma perezosa. Puede verificar las colecciones antes de acceder a ellas a través org.hibernate.Hibernate.isInitialized(...)
o PersistenceUnitUtil#isLoaded(...)
en JPA2.
Sin embargo, le sugiero que use Data-Transfer-Objects en este punto. Para el caso de uso especial, donde las colecciones no son necesarias, simplemente cree una copia similar de su entidad sin esas propiedades innecesarias. Por supuesto, su creación de DTO debe realizarse dentro de una sesión abierta.
Creo que está tratando de hacer JOIN pero no FETCH, puede que solo esté usando los atributos de los objetos secundarios en la condición where. Me pregunto si algo así funcionará en JPQL.
@Query("Select u from UserModel u INNER JOIN u.credentialList c INNER JOIN u.actionList a")