web-dev-qa-db-ja.com

Spring JPA Projection findAll

投影のコレクション/リストを返すJPARepositoryに「findAll」を使用することはできますか?例:

@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();
}

@Queryを使用すると動作します!しかし、使用することはできません

 List<LoginProjection> findAll();

LoginProjectionはT(Login)を拡張しないためです。

FindAllと同じことをするfindAllXYZのようなfindAllに「エイリアス」を与えることが可能かどうか考えていました。フィルターを使用しても機能しますが、使用したくありません。

 List<LoginProjection> findAllByName(String name);

私の主な目標は次のようなものです。

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

    List<Login> findAll();

    List<LoginProjection> findAllLoginProjection();
}

これは非常に簡単で、「ゼロ@Query」で

12
user3558040

そして、リポジトリにメソッドを追加します。

List<LoginProjection> findAllProjectedBy();
18
Pavel Molchanov

Spring Data REST を使用していないと想定しているため、@Projectionはここでは役に立ちません。 @ pavel-molchanovは、投影を表現する1つの形式を示しましたが、別の形式は次のとおりです。

List<LoginProjection> findBy();

複数のプロジェクションがある場合、 dynamicprojections のように、各プロジェクションのリポジトリにメソッドを作成しないようにすることができますこの:

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

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