kotlin 如何在Spring Data JPQL LIKE查询中转义'_'和'%'通配符?

jk9hmnmh  于 2023-05-29  发布在  Kotlin
关注(0)|答案(1)|浏览(202)

我在Spring Data 仓库中有以下方法:

@Query("""
    select t from ToneEntity t
    where (:title is null or (t.title like %:title%))
    and (:albumId is null or (t.album.id = :albumId))
    and (:artistId is null or (t.artist.id = :artistId))
    and (:creatorId is null or (t.creator.id = :creatorId))
""")
fun findFilteredTones(
    @Param("title") title: String?,
    @Param("albumId") albumId: Long?,
    @Param("artistId") artistId: Long?,
    @Param("creatorId") creatorId: Long?,
    pageable: Pageable
): List<ToneEntity>

当标题包含_或%字符时,Spring Data 将它们作为通配符传递,而不是作为文字传递。例如:我在数据库中有一个标题为“bug_with_underscore”的音调。Web UI上的用户传递“”以查找标题中带有“”文字的音调,但实际结果包括所有音调。
如何在LIKE查询中设置自动字符转义?
Spring Data JPA版本:2.3.5
我发现了几种可能的解决方案:
1.使用concat和replace SQL函数:https://stackoverflow.com/questions/30740432/escaping-values-in-spring-data-repository
1.在将通配符传递给查询之前屏蔽它们:https://stackoverflow.com/questions/53558667/java-jpa-sql-accept-wrong-with-like
2022年有更好的解决方案吗?到目前为止,我还没有发现比使用方面手动转义通配符更好的方法。因为这个问题在我们的项目中经常发生

fbcarpbf

fbcarpbf1#

这可能对你有帮助,但不幸的是,它对我没有帮助,因为这种语法在Sping Boot 3中不再有效。我在Sping Boot 2中尝试了它,并且成功了。它是在Java中,但查询部分不应该有任何不同。

@Query("SELECT m FROM Movie m WHERE m.director LIKE %?#{escape([0])} escape ?#{escapeCharacter()}")
List<Movie> searchByDirectorEndsWith(String director);

来源:https://www.baeldung.com/spring-jpa-like-queries#2-ordered-parameters

相关问题