web-dev-qa-db-fra.com

Spring JPA Projection findAll

Est-il possible d'utiliser "findAll" pour un JPARepository renvoyant une collection/liste de projections? Exemple:

@Entity
public class Login {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
    @GenericGenerator(name = "native", strategy = "native")
    private Integer id;

    private String name;

    private String pass;

    (...)

}

public interface LoginProjection {
    public String getName();
}

@Repository
public interface LoginRepository extends JpaRepository<Login, Long> {
    Login findByName(String name);

    @Query(value = "SELECT name FROM login", nativeQuery = true)
    List<LoginProjection> findAllLoginProjection();
}

En utilisant @Query cela fonctionne! Mais il n'est pas possible d'utiliser

 List<LoginProjection> findAll();

Étant donné que LoginProjection ne prolonge pas T (Login).

Je pensais s'il était possible de donner un "alias" pour findAll comme findAllXYZ qui fait la même chose que findAll. En utilisant des filtres ça marche aussi, mais je ne veux pas les utiliser:

 List<LoginProjection> findAllByName(String name);

Mon objectif principal serait quelque chose comme ceci:

@Repository
public interface LoginRepository extends JpaRepository<Login, Long> {
    Login findByName(String name);

    List<Login> findAll();

    List<LoginProjection> findAllLoginProjection();
}

Ce qui est assez facile et avec "zero @Query"

12
user3558040

Et ajoutez une méthode au référentiel:

List<LoginProjection> findAllProjectedBy();
18
Pavel Molchanov

Je suppose que vous n'utilisez pas Spring Data REST , donc @Projection n'aidera pas ici. @ pavel-molchanov a montré une forme d'expression de la projection, une autre forme est:

List<LoginProjection> findBy();

Si vous avez plusieurs projections, vous pouvez éviter de créer une méthode dans le référentiel pour chaque projection en utilisant des projections dynamiques comme par ex. cette:

<T> List<T> findBy(Class<T> projection);

// usage e.g.
... = findBy(LoginProjection.class);
... = findBy(UserSummaryProjection.class);
3
t0r0X