对于返回投影集合/列表的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();
}
这非常简单,并且使用"zero @Query“
发布于 2018-06-16 02:05:58
并向存储库添加一个方法:
List<LoginProjection> findAllProjectedBy();
方法名可以简化为findBy()
,以与https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections上的文档示例相匹配
发布于 2019-06-25 17:57:43
我假设您没有使用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);
发布于 2021-11-16 14:30:12
如果您想要更灵活,可以将此方法添加到存储库
<T> List<T> findBy(Class<T> projection);
然后,您可以使用以下代码调用它
List<LoginProjection> rows = loginRepository.findBy(LoginProjection.class);
此方法的优点在于,您可以使用同一查询来使用所需的所有投影
https://stackoverflow.com/questions/50879431
复制相似问题