动态更改 Spring Data 查询字符串

问题描述

我有以下 Spring Data Repository 方法

@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);