春季 JPA 投影查找全部

2022-09-01 21:42:58

是否可以对返回投影集合/列表的 JPA 存储库使用“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”


答案 1

并将方法添加到存储库:

List<LoginProjection> findAllProjectedBy();

方法名称可以简化为与 https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections 中的文档示例相匹配findBy()


答案 2

我假设你没有使用Spring Data REST,所以在这里没有帮助。@pavel-molchanov展示了一种表达投影的形式,另一种形式是:@Projection

List<LoginProjection> findBy();

如果您有多个投影,则可以通过使用动态投影来避免在存储库中为每个投影创建方法,例如:

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

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

推荐