首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring JPA Projection findAll

Spring JPA Projection findAll
EN

Stack Overflow用户
提问于 2018-06-16 00:20:32
回答 3查看 13K关注 0票数 22

对于返回投影集合/列表的JPARepository,是否可以使用"findAll“?示例:

代码语言:javascript
运行
复制
@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;

    (...)

}

代码语言:javascript
运行
复制
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它可以工作!但是它不可能使用

代码语言:javascript
运行
复制
 List<LoginProjection> findAll();

因为LoginProjection没有扩展T(登录)。

我在想,是否有可能为findAll提供一个“别名”,比如findAllXYZ,它可以做与findAll相同的事情。使用过滤器也可以,但我不想使用它们:

代码语言:javascript
运行
复制
 List<LoginProjection> findAllByName(String name);

我的主要目标是这样的:

代码语言:javascript
运行
复制
@Repository
public interface LoginRepository extends JpaRepository<Login, Long> {
    Login findByName(String name);

    List<Login> findAll();

    List<LoginProjection> findAllLoginProjection();
}

这非常简单,并且使用"zero @Query“

EN

回答 3

Stack Overflow用户

发布于 2018-06-16 02:05:58

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

代码语言:javascript
运行
复制
List<LoginProjection> findAllProjectedBy();

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

票数 41
EN

Stack Overflow用户

发布于 2019-06-25 17:57:43

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

代码语言:javascript
运行
复制
List<LoginProjection> findBy();

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

代码语言:javascript
运行
复制
<T> List<T> findBy(Class<T> projection);

// usage e.g.
... = findBy(LoginProjection.class);
... = findBy(UserSummaryProjection.class);
票数 14
EN

Stack Overflow用户

发布于 2021-11-16 14:30:12

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

代码语言:javascript
运行
复制
<T> List<T> findBy(Class<T> projection);

然后,您可以使用以下代码调用它

代码语言:javascript
运行
复制
List<LoginProjection> rows = loginRepository.findBy(LoginProjection.class);

此方法的优点在于,您可以使用同一查询来使用所需的所有投影

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50879431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档