繁体   English   中英

动态更改 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM