Я ищу решение для динамической сборки запросов с помощью Spring Data JPA. У меня есть GameController, у которого есть конечная точка/игры службы RESTful, которая принимает 4 необязательных параметра: жанр, платформа, год, название. API может быть передан ни один из них, все 4 и каждая комбинация между ними. Если какой-либо параметр не передан, он по умолчанию имеет значение null. Мне нужен метод в Репозитории, который построит соответствующий запрос и в идеале также позволит Spring Data JPA Paging, хотя я не уверен, что это возможно.
Я нашел эту статью, но это не похоже на то, что мне нужно, если я не понимаю. http://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/
Я знаю, что JPA имеет API критериев запросов, но на самом деле понятия не имеет, как реализовать это.
Я понимаю, что могу создать метод для каждого возможного сценария, но это похоже на действительно плохую практику и много ненужного кода.
GameRepository:
package net.jkratz.igdb.repository;
import net.jkratz.igdb.model.Game;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
public interface GameRepository extends JpaRepository<Game, Long> {
@Query("select g from Game g, GamePlatformMap gpm, Platform p where g = gpm.game and gpm.platform = p and p.id = :platform")
Page<Game> getGamesByPlatform(@Param("platform") Long platformId, Pageable pageable);
@Query("select g from Game g where g.title like :title")
Page<Game> getGamesByTitle(@Param("title") String title, Pageable pageable);
@Query("select g from Game g, GameGenreMap ggm, Genre ge where g = ggm.game and ggm.genre = ge and ge.id = :genreId")
Page<Game> getGamesByGenre(@Param("genre") Long genreId, Pageable pageable);
}