动态更改 Spring 数据查询字符串

Dynamically change the Spring Data query strings

我有以下 Spring 数据存储库方法:

@Query(value = "SELECT * FROM movies m " +
        "WHERE m.approved = true " +
        "AND NOT exists (SELECT user_id FROM movie_lists ml WHERE ml.movie_id = m.id and ml.user_id = :userId)",
        countQuery = "SELECT count(*) FROM movies m " +
                "WHERE m.approved = true " +
                "AND NOT exists (SELECT user_id FROM movie_lists ml WHERE ml.movie_id = m.id and ml.user_id = :userId)",
        nativeQuery = true)
Page<Movie> findAllApprovedNotListedInUser(@Param("userId") Long userId, Pageable pageable);

或另一个

@Query(value = "SELECT m.* FROM movies m " +
            "WHERE m.approved = true " +
            "AND m.release_year >= :minReleaseYear AND m.release_year <= :maxReleaseYear " +
            "AND exists (SELECT movie_id FROM movies_genres mg WHERE mg.movie_id = m.id AND mg.genre_id IN :likedGenres LIMIT 1) " +
            "AND NOT exists (SELECT movie_id FROM movies_genres mg WHERE mg.movie_id = m.id AND mg.genre_id IN :dislikedGenres LIMIT 1) " +
            "AND NOT exists (SELECT user_id FROM movie_lists ml WHERE ml.movie_id = m.id and ml.user_id = :userId LIMIT 1)",
            countQuery = "SELECT count(*) FROM movies m " +
                    "WHERE m.approved = true " +
                    "AND m.release_year >= :minReleaseYear AND m.release_year <= :maxReleaseYear " +
                    "AND exists (SELECT movie_id FROM movies_genres mg WHERE mg.movie_id = m.id AND mg.genre_id IN :likedGenres LIMIT 1) " +
                    "AND NOT exists (SELECT movie_id FROM movies_genres mg WHERE mg.movie_id = m.id AND mg.genre_id IN :dislikedGenres LIMIT 1) " +
                    "AND NOT exists (SELECT user_id FROM movie_lists ml WHERE ml.movie_id = m.id and ml.user_id = :userId LIMIT 1)",
            nativeQuery = true)
    Page<Movie> findAllApprovedNotListedInUser(@Param("userId") Long userId, @Param("minReleaseYear") int minReleaseYear, @Param("maxReleaseYear") int maxReleaseYear, @Param("likedGenres") Set<Long> likedGenres, @Param("dislikedGenres") Set<Long> dislikedGenres, Pageable pageable);

我想在运行时动态设置 Query.value 和 Query.countQuery 字符串。有可能吗?我希望能够动态更改查询字符串。

我有 6 个不同的参数,根据它们是否存在值,我想更改查询的 WHERE 部分。

你能试试这个吗(我删除了 countQuery 以帮助保持它的可读性):

@Query(value = "SELECT m.* FROM movies m " +
        "WHERE m.approved = true " +
        "AND ( :minReleaseYear is null OR m.release_year BETWEEN :minReleaseYear AND :maxReleaseYear )" +
        "AND ( :likedGenres IS NULL OR exists (SELECT movie_id FROM movies_genres mg WHERE mg.movie_id = m.id AND mg.genre_id IN :likedGenres LIMIT 1) ) " +
        "AND ( :dislikedGenres IS NULL OR NOT exists (SELECT movie_id FROM movies_genres mg WHERE mg.movie_id = m.id AND mg.genre_id IN :dislikedGenres LIMIT 1) ) " +
        "AND NOT exists (SELECT user_id FROM movie_lists ml WHERE ml.movie_id = m.id and ml.user_id = :userId LIMIT 1)",
        nativeQuery = true)
Page<Movie> findAllApprovedNotListedInUser(@Param("userId") Long userId, @Param("minReleaseYear") int minReleaseYear, @Param("maxReleaseYear") int maxReleaseYear, @Param("likedGenres") Set<Long> likedGenres, @Param("dislikedGenres") Set<Long> dislikedGenres, Pageable pageable);