JpaRepository的Spring Data REST自定义查找程序

时间:2013-11-11 21:08:57

标签: spring-data-jpa querydsl spring-data-rest

我希望使用通用查找程序构建REST接口。我们的想法是提供一个搜索表单,用户可以通过不提供任何参数来获取所有记录,也可以通过键入任意字段组合来优化搜索结果。

我用@RestResource注释JpaRepository的简单示例提供了一种开箱即用的方法来添加查找器,方法是使用@Query或方法名称约定

@RestResource(path = "users", rel = "users")
public interface UserRepository extends JpaRepository<User, Long>{
    public Page<User> findByFirstNameStartingWithIgnoreCase(@Param("first") String fName, Pageable page);
}

我希望添加一个自定义查找器来映射我的参数,并利用分页,排序和REST支持,其中实际的实现查询将动态组合(可能使用QueryDSL),方法将 n 参数(p 1 ... p n ),看起来像:

public Page<User> findCustom(@Param("p1") String p1, @Param("p2") String p2, ... @Param("pn") String pn, Pageable page);

我尝试过以下描述的方法:

http://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/repositories.html#repositories.custom-implementations

但是我的自定义方法不能从存储库的REST接口(/ users / search)

中获得

我希望有人已经明白了这一点,并希望能给我一些指导。

1 个答案:

答案 0 :(得分:1)

尝试这样的事情但当然采用你的方案:

public interface LocationRepository extends CrudRepository, 
    PagingAndSortingRepository,
    LocationRepositoryExt {

}
public interface LocationRepositoryExt {
    @Query
    public List findByStateCodeAndLocationNumber(@Param("stateCode") StateCode stateCode,   @Param("locationNumber") String locationNumber);
}
class LocationRepositoryImpl extends QueryDslRepositorySupport implements LocationRepositoryExt {

    private static final QLocation location = QLocation.location;

    public LocationRepositoryImpl() {
        super(Location.class);
    }

    @Override
    public Page findByStateAndLocationNumber(@Param("state") State state, @Param("locationNumber") String locationNumber, Pageable pageable) {

        List locations = from(location)
                .where(location.state.eq(state)
                        .and(location.locationNumber.eq(locationNumber)))
                .list(location);

        return new PageImpl(locations, pageable, locations.size());
    }
}