public interface UserRepository extends JpaRepository<User, Long> {
@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?0", nativeQuery = true)
User findByEmailAddress(String emailAddress);
}
Disons que j'ai le code ci-dessus où je sélectionne * de l'utilisateur. Que dois-je faire si je ne veux pas que cette méthode renvoie l'objet User? Existe-t-il un moyen de mapper manuellement les données sur un objet personnalisé MyUser? Puis-je faire tout cela dans l'interface UserRepository?
Merci!
Vous pouvez faire quelque chose comme ça
@Query(value = "SELECT YOUR Column1, ColumnN FROM USERS WHERE EMAIL_ADDRESS = ?0", nativeQuery = true)
List<Object[]> findByEmailAddress(String emailAddress);
Vous devez faire la cartographie. Consultez également le référentiel de données Spring. La source
Qu'en est-il de la projection basée sur l'interface ?
En gros, vous écrivez une interface avec des getters qui correspondent aux paramètres de requête SQL.
De cette façon, vous n'avez même pas besoin de forcer le paramètre @Id
sur la projection:
public class Book {
@Id
private Long id;
private String title;
private LocalDate published;
}
public interface BookReportItem {
int getYear();
int getMonth();
long getCount();
}
public interface BookRepository extends Repository<Book, Long> {
@Query(value = "select " +
" year(b.published) as year," +
" month(b.published) as month," +
" count(b) as count," +
" from Book b" +
" group by year(b.published), month(b.published)")
List<BookReportItem> getPerMonthReport();
}
Il utilise org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap
ci-dessous en tant que proxy pour l'interface dans l'implémentation Spring actuelle.
Cela fonctionne aussi pour nativeQuery = true
.