Spring REST @Query变量参数

时间:2018-01-27 13:16:38

标签: java spring spring-data-jpa jpql spring-rest

我目前正在构建一个REST API,并希望添加一个搜索方法,该方法接收一个字母列表并根据这些字母搜索序列。我下面的代码是我迄今为止所取得的成就的一个例子。它完成工作,并根据字母参数进行搜索。但它仅限于必须使用该方法中指定的参数数量。

@Query("SELECT f FROM Item f " +
        "WHERE LOWER(f.title) LIKE CONCAT(" +
        "  '%',LOWER(:letter1)," +
        "  '%',LOWER(:letter2)," +
        "  '%',LOWER(:letter3)," +
        "  '%',LOWER(:letter4),'%')")
@RestResource(rel = "title-fragmented", path="findByFragments")
Page<Item> findByFragmented(@Param("letter1") String letter1,
    @Param("letter2") String letter2,
    @Param("letter3") String letter3,
    @Param("letter4") String letter4,
    Pageable page
);

我想知道是否可以在不指定要连接的字母数的情况下实现相同的结果。所以例如

/api/v1/search/findByfragments?letter=A&letter=B&letter=C.... 

被调用,它将起作用。我已经尝试将字符串数组作为@Param值传递,但无法使其工作。

提前致谢。

1 个答案:

答案 0 :(得分:1)

通过使用SpEL表达式拆分单个字符串,并用通配符(%)表达式替换它们之间的字母来解决我的问题。以下示例适用于任何可能遇到同样问题的人:

@Query(
  "SELECT f FROM Item f WHERE LOWER(f.title) LIKE CONCAT('%',LOWER(:#{#title.replaceAll('','%')}),'%')"
)
@RestResource(rel = "item-title-by-fragments", path="fragments")
Page<Item> findUsingFragments(@Param("title") String title, Pageable page);