Пользовательский поиск Spring Data REST для JpaRepository

Я хочу создать интерфейс REST с помощью универсального искателя. Идея состоит в том, чтобы предоставить форму поиска, в которой пользователи могут получить все записи, не указывая никаких параметров, или уточнить результаты поиска, введя любую комбинацию полей.

Простой пример, который у меня есть, аннотирует JpaRepository с помощью @RestResource, который предоставляет хороший готовый способ добавления средств поиска либо с помощью @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)

Я надеюсь, что кто-то уже понял это и будет любезен дать мне какое-то направление.


person nyl66    schedule 11.11.2013    source источник
comment
вы с этим чего-нибудь добились?   -  person wenic    schedule 02.12.2013
comment
Не совсем. Я уже выполнял большинство пользовательских предикативных запросов queryDSL в контроллере, но все же было бы неплохо узнать, возможно ли это и как.   -  person nyl66    schedule 12.12.2013
comment
Я пытаюсь решить ту же проблему. Когда вы реализовали запросы в контроллере, как вы обрабатывали пейджинг?   -  person JBCP    schedule 17.10.2014


Ответы (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());
    }
}
person michaeligler    schedule 13.12.2014