[英]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.