findAll 与 findAll 与投影中的 CrudRepository 发生冲突

let*_*ive 2 jpa spring-data-jpa spring-data-rest

登录

@ApiModel
@Entity
public class Login {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    private LocalDateTime loginDateTime;

    /** Other fields ***/
} 
Run Code Online (Sandbox Code Playgroud)

仅登录日期

interface LoginDateOnly {

    @Value("#{target.loginDateTime.toLocalDate()}")
    LocalDate getDateFromLoginDateTime();

}
Run Code Online (Sandbox Code Playgroud)

登录库

@RepositoryRestResource(collectionResourceRel = "login", path = "login")
public interface LoginRepository extends PagingAndSortingRepository<Login, Long> {

    Collection<LoginDateOnly> findAll();

    /** Other query methods **/
}
Run Code Online (Sandbox Code Playgroud)

我只是想获得所有我的登录记录,与LOCALDATE的部分我的loginDateTime选择使用/投射http://host/api/login。但目前我遇到了与 CrudRepository 的 findAll() 的冲突。如何使用投影尽可能地解决这个问题。我正在将 @Query 和 @NamedQuery 作为最后的手段。

Cep*_*pr0 5

findAll方法签名是:

List<T> findAll();
Run Code Online (Sandbox Code Playgroud)

如果要覆盖它,则不能使用其他签名。

获取投影列表所需的只是为此定义另一种方法,例如:

Collection<LoginDateOnly> findAllBy();
Run Code Online (Sandbox Code Playgroud)

但正如我所看到的,您正在使用 Spring Data REST,因此在这种情况下,您不需要定义新方法。您应该首先@Projection在投影中添加注释:

@Projection(name = "loginDateOnly", types = Login.class)
interface LoginDateOnly {
    //...
}
Run Code Online (Sandbox Code Playgroud)

然后在请求 url 中使用它的名称:

GET http://host/api/login?projection=loginDateOnly
Run Code Online (Sandbox Code Playgroud)

在文档中查看更多信息:投影和摘录