【问题标题】:Spring JPA Projection findAllSpring JPA 投影 findAll
【发布时间】:2018-11-25 12:38:26
【问题描述】:

是否可以对 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(登录)。

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

【问题讨论】:

  • 列表 findAllProjectedBy();
  • 您可能需要使用@Projection 注解来注解投影接口:@Projection(name = "name" , types = Login.class)

标签: java spring spring-data-jpa jpql


【解决方案1】:

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

List<LoginProjection> findAllProjectedBy();

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

【讨论】:

  • 其实是“List findAllProjectedBy();”足够的!谢谢
  • 应用了你的评论 :)
  • 您所需要的只是findBy()findBy 之间的部分会被查询生成忽略。
  • @JensSchauder 如果findBy 之间的部分不是以大写字符开头,则会失败。
  • 你在哪里找到的?在docs.spring.io/spring-data/jpa/docs/current/reference/html 对“ProjectedBy”的提及为零
【解决方案2】:

我假设你没有使用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);

【讨论】:

【解决方案3】:

如果您想更灵活,可以将此方法添加到存储库中

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

然后您可以使用以下方式调用它

List<LoginProjection> rows = loginRepository.findBy(LoginProjection.class);

这种方法的优点是你可以使用同一个查询来使用你想要的所有投影

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-19
    • 2021-10-29
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多