Spring JPA Projection findAll

时间:2018-06-15 16:20:32

标签: java spring spring-data-jpa jpql

是否可以使用“findAll”为JPARepository返回一个Collection / List of Projections? 例如:

@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(登录)。

我在想是否有可能为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”

2 个答案:

答案 0 :(得分:10)

并向存储库添加一个方法:

List<LoginProjection> findAllProjectedBy();

答案 1 :(得分:1)

我认为您没有使用Spring Data REST,因此@Projection在这里无济于事。 @ pavel-molchanov显示了一种表达投影的形式,另一种形式是:

List<LoginProjection> findBy();

如果您有多个投影,则可以避免使用dynamic projections在存储库中为每个投影创建一个方法,例如这个:

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

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