【发布时间】: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