Ciao a tutti.
Avrei la necessità (in realtà è più un desiderio, che una reale necessità) di far restituire ad un JPA Repository di Spring Boot una lista di projections derivante da una custom query realizzata all'interno dell'implementazione di un custom repository.
Mi spiego meglio.
Ho la mia entity (chiamiamola Persona).
Ho definito la mia projection (chiamiamola PersonaSemplice) che espone solo una parte dei campi di Persona (ovvero è una interface).
Ho, quindi, il mio JpaRepository al cui interno posso usare tranquillamente la mia projection:
public interface PersonaRepository extends JpaRepository<Persona, Integer> {
... // vari metodi
@Query("SELECT p FROM Persona p ORDER BY p.cognome")
List<PersonaSemplice> getPersoneSemplificato();
}
Fin qui nessun problema: Spring Boot effettua automaticamente il proxy tra l'entity Persona e la projection PersonaSemplice.
Ora nasce l'esigenza di eseguire una query un po' più articolata, tale che l'annotation @Query non è più sufficiente; ho la necessità, quindi, di definire un Repository custom. Definisco, quindi la mia nuova interfaccia:
public interface PersonaRepositoryCustom {
List<PersonaSemplice> getPersoneSemplificatoConSpecifiche( ... );
}
Aggiorno il PersonaRepository:
public interface PersonaRepository extends JpaRepository<Persona, Integer>, PersonaRepositoryCustom {
...
}
E implemento la mia nuova interfaccia:
public class PersonaRepositoryCustomImpl implements PersonaRepositoryCustom {
@PersistenceContext
EntityManager em;
@Override
public List<PersonaSemplice> getPersoneSemplificatoConSpecifiche( ... ) {
// Eseguo la mia query articolata, usando l'EntityManager
StringBuilder sql = new StringBuilder();
sql.append("SELECT p FROM Persona p WHERE ...");
... // Aggiungo determinate condizioni in funzione dei parametri passati
... // Altre specifiche di ritorno massimo, ecc.
TypedQuery<PersonaSemplice> qry = em.createQuery(sql, PersonaSemplice.class);
...
return qry.getResultList();
}
E qui, ovviamente, nasce il problema: PersonaSemplice non è una Entity, quindi non la posso usare per tipizzare la TypedQuery (se ci si prova, si ottiene una "IllegalArgumentException: Type specified for TypedQuery is incompatible with the query return type", che è ovvia: la query fa riferimento ad una entity "Persona", mentre la TypedQuery è stata tipizzata con una interface).
Da qui la domanda: come posso ottenere che Spring Boot effettui il proxy dalla entity alla projection (come fa normalmente in automatico) quando ho una custom query come definito sopra? Sempre se è possibile, altrimenti fa nulla, lavoro direttamente con le entity.
Grazie per qualunque info.