JPQL动态查询(模糊查询)中通配符与动态变量联合使用的限制

简介: JPQL动态查询(模糊查询)中 通配符 与 动态变量 联合使用 的限制:JPQL动态查询 参数不存在问题解决:错误使用方式=>形如如下代码:1/2:public Item fuzzySearch(String name) { String queryString = "SELECT i FROM Item i WHERE i.name L

JPQL动态查询(模糊查询)中 通配符动态变量 联合使用 的限制:

JPQL动态查询 参数不存在问题解决:

错误使用方式=>形如如下代码

1/2:

public Item fuzzySearch(String name) {

    String queryString = "SELECT i FROM Item i WHERE i.name LIKE '%:param%'";
    Query query = em.createQuery(queryString);

    query.setParameter("param", name);
    return (Item) query.getSingleResult();
}

2/2:

@SuppressWarnings("unchecked")
public List<Item> fuzzySearch(String name) {
    return em.createQuery("SELECT i FROM Item i " +
                          "WHERE i.name LIKE '%?%' ")
                    .setParameter(1, name) 
                    .getResultList();  
}

总会报出如下错误

java.lang.IllegalArgumentException: Parameter with that position [1] did not exist
java.lang.IllegalArgumentException: Parameter with that name [param] did not exist
亦或是
(javax.servlet.ServletException: javax.servlet.ServletException: Parameter with that position [1] did not exist)
(javax.servlet.ServletException: javax.servlet.ServletException: Parameter with that name [param] did not exist)

解决方法

核心思想:将 通配符 挪到变量里就可以了~

正确用法:

public Item singleFuzzySearch(String name) {

    String queryString = "SELECT i FROM Item i WHERE i.name LIKE :param";
    Query query = em.createQuery(queryString);

    query.setParameter("param", "'%"+name+"%'");
    return (Item) query.getSingleResult();
}
@SuppressWarnings("unchecked")
public List<Item> fuzzySearch(String name) {
    return em.createQuery("SELECT i FROM Item i " +
                          "WHERE i.name LIKE ? ")
                    .setParameter(1, "'%" + name + "%'" ) 
                    .getResultList();  
}

使用时需注意:
1. 通配符(%)的位置,位置变量(?)的参数
2. :param / ? 、得到对象单值/List

目录
相关文章
接口数据多条件搜索(模糊查询)
接口数据多条件搜索(模糊查询)
232 0
queryDsl多表联合查询,任意查询联合字段
这是我的通用方法 package com.spark.bitrade.service.Base; import com.querydsl.core.Tuple; import com.
4256 0
|
5月前
|
索引
Elasticsearch 精确查询:术语查询、多术语查询、主键查询、范围查询、存在查询、前缀查询、正则查询与通配符查询
Elasticsearch 精确查询:术语查询、多术语查询、主键查询、范围查询、存在查询、前缀查询、正则查询与通配符查询
|
5月前
|
SQL 安全 数据挖掘
Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的?
Elasticsearch聚合查询用于复杂数据分析,包括统计空值率。示例展示了如何计算字段`my_field`非空非零文档的百分比。查询分为三步:总文档数计数、符合条件文档数计数及计算百分比。聚合概念涵盖度量、桶和管道聚合。脚本在聚合中用于动态计算。常见聚合类型如`sum`、`avg`、`date_histogram`等。组合使用可实现多值统计、嵌套聚合和空值率计算。[阅读更多](https://zhangfeidezhu.com/?p=515)
298 0
Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的?
|
5月前
|
关系型数据库 MySQL PHP
【thinkphp知识】thinkphp 使用union链式操作合并两个或多个 SELECT 语句的结果集,新增不存在的字段,并赋予默认值
【thinkphp知识】thinkphp 使用union链式操作合并两个或多个 SELECT 语句的结果集,新增不存在的字段,并赋予默认值
62 0
|
6月前
|
C#
C#动态查询:巧用Expression组合多条件表达式
在C#中,利用`Expression`类和`AndAlso`、`OrElse`方法,可以组合两个`Expression&lt;Func&lt;T, bool&gt;&gt;`以实现动态多条件查询。该方法通过构建表达式树,方便地构建复杂查询。示例代码展示了如何创建表达式树,分别检查年龄大于等于18和姓名为&quot;John&quot;的条件,并使用`AndAlso`组合这两个条件,最终编译为可执行的委托进行测试。
260 1
|
11月前
|
SQL 安全 Java
MyBatid动态语句且模糊查询
MyBatid动态语句且模糊查询
62 0
|
Java 数据库 Python
语法查询网站
语法查询网站
18992 1
下一篇
无影云桌面