【问题标题】:Spring Data JPA and startsWith repositorySpring Data JPA 和 startsWith 存储库
【发布时间】:2016-12-26 06:02:42
【问题描述】:

我有以下 Spring Data JPA 存储库:

@RepositoryRestResource(collectionResourceRel = "product", path = "product")
public interface ProductRepository extends PagingAndSortingRepository<Product, Integer> {

    @RestResource(path = "nameStartsWith", rel = "nameStartsWith")
    Page findByNameStartsWithOrderByNameDesc(@Param("name") String name, Pageable p);


}

Product类的定义很明显,是postgresql数据库上映射的JPA实体。

它工作得很好,但它有一个我无法解决的烦人问题。

我认为 spring 在 sql 查询中使用 like 运算符翻译此方法定义,该运算符使用 _% 作为通配符。无论如何,我担心这些字符在传递给此方法时不会被转义,结果是,如果我搜索名称包含 _ 的产品,它会被理解为“任何字符”,这是不好的我的产品使用的命名约定。

我需要一种方法在 name 参数传递给方法之前对其进行转义,但我能想到的唯一方法是自己实现该方法,从而失去弹簧数据的所有魔力。有没有更优雅的方法来做到这一点?

谢谢!

PS 我使用的是 spring boot 1.4.0

【问题讨论】:

  • 您遇到问题了吗?
  • 我会首先检查 Spring 是否已经转义 % 和 _ 字符并生成正确的 SQL 查询,而不是仅仅假设。你可能是对的,但也许它已经处理好了。打开 SQL 日志记录,看看产生了什么。
  • 您好 JB,该方法的行为很明显,因为它返回的产品带有任何字符代替 _,因此它没有被转义,或者 spring 数据中的某个地方存在更大的错误。无论如何,只需查看休眠日志即可确认我所说的:生成的查询使用 like 运算符,参数是输入中给出的参数,未转义。

标签: java postgresql spring-data-jpa


【解决方案1】:

您可以使用@Query 注释围绕此方法包装自定义sql 查询。这是相关文档。

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.at-query

【讨论】:

    猜你喜欢
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2018-10-06
    • 2018-06-15
    • 1970-01-01
    相关资源
    最近更新 更多