【问题标题】:How to use quote inside LIKE jpql query?如何在 LIKE jpql 查询中使用报价?
【发布时间】:2020-02-05 04:21:15
【问题描述】:

所以,我正在尝试编写一些自定义 JPQL 查询构建器。 我有一个类似的端点:

/api/library/authors/search?query=test tested

在服务层,这个query 参数将被转换为类似JPQL 查询的smth:

SELECT t FROM Author t WHERE t.fullName LIKE '%test tested%' 
     OR t.firstName  LIKE '%test%' 
     OR t.firstName  LIKE '%tested%' 
     OR t.secondName LIKE '%test%' 
     OR t.secondName LIKE '%tested%'

它对我来说非常好用,但是 firstNamesecondName 表列可能包含带有引号 ' 的值,例如 O'Hara。然后就不行了。

/api/library/authors/search?query=Tes O'Ha

所以,我尝试在查询中将' 替换为双引号",如下所示:

SELECT t FROM Author t WHERE t.fullName LIKE "%Tes O'Ha%" 
     OR t.firstName  LIKE "%Tes%" 
     OR t.firstName  LIKE "%O'Ha%" 
     OR t.secondName LIKE "%Tes%" 
     OR t.secondName LIKE "%O'Ha%"

我遇到了一个异常:

org.hibernate.QueryException: unexpected char: '"'

我还尝试替换 \' 上的 '\" 上的 "。所有它都不起作用并抛出异常......

我正在使用 EntityManager 执行此查询:

@Repository
public class SearchFor {
    @PersistenceContext
    private EntityManager entityManager;

    public List execute(String query) {
        return entityManager.createQuery(query).getResultList();
    }      
}

如何搜索包含单引号 ' 的值?

【问题讨论】:

  • 你试过转义 ***LIKE "%Tes O\'Ha%" *** 吗?

标签: java spring hibernate jpql


【解决方案1】:

我建议您使用索引或命名参数来创建查询。这将解决您的问题,因为它会自动转义任何命令字符。

类似这样的:

em.createQuery("SELECT t FROM TestEntity t WHERE t.fullName LIKE :fullName " 
                + "OR t.firstName  LIKE :firstName " 
                + "OR t.firstName  LIKE :lastName " 
                + "OR t.lastName LIKE :firstName " 
                + "OR t.lastName LIKE :lastName") 
                .setParameter("firstName", firstName) 
                .setParameter("lastName", lastName) 
                .setParameter("fullName", fullName)
                .getResultList();

我假设你从服务层的方法参数中获取了你的名字、姓氏、全名。

此外,您当前的实现使您的应用容易受到 SQL/JPQL 攻击,因为用户可以通过 REST 端点注入恶意代码。

关于 SQL 注入的更多信息: https://www.baeldung.com/sql-injection

使用命名和索引参数创建查询: https://www.baeldung.com/jpa-query-parameters

【讨论】:

  • 在我的情况下它不起作用。 sql 查询取决于搜索查询中的字数。它不是一个静态字符串,我可以在其中传递不同的参数。 OR 语句的计数在两次调用中可能不同,并且查询总是动态变化
  • 我明白了。您可以使用它查看 CriteriaQuery API,您可以真正创建动态查询:objectdb.com/java/jpa/query/criteria
【解决方案2】:

我找到了解决方案! 而且......这很简单。只需将 '' 之类的引号加倍即可

JPQL 查询将如下所示:

SELECT t FROM Author t WHERE t.fullName LIKE '%Tes O''Ha%' 
    OR t.firstName  LIKE '%Tes%' 
    OR t.firstName  LIKE '%O''Ha%' 
    OR t.secondName LIKE '%Tes%' 
    OR t.secondName LIKE '%O''Ha%'

就是这样!

【讨论】:

    猜你喜欢
    • 2021-05-27
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    相关资源
    最近更新 更多