在投影中,findAll与带有CrudRepository的findAll发生冲突

时间:2018-06-20 14:37:17

标签: 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 ***/
} 

仅登录日期

interface LoginDateOnly {

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

}

登录库

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

    Collection<LoginDateOnly> findAll();

    /** Other query methods **/
}

我只是想获得我的登录记录的全部,并使用loginDateTime选择/投影我的http://host/api/login LocalDate部分。但是目前,我与CrudRepository的findAll()发生冲突。如何使用投影尽可能解决这个问题。我把@Query和@NamedQuery当作最后的手段。

1 个答案:

答案 0 :(得分:2)

findAll方法签名是:

List<T> findAll();

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

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

Collection<LoginDateOnly> findAllBy();

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

@Projection(name = "loginDateOnly", types = Login.class)
interface LoginDateOnly {
    //...
}

然后在请求网址中使用其名称:

GET http://host/api/login?projection=loginDateOnly

在文档中查看更多信息:Projections and Excerpts