JPA构建多条件查询

news/2024/6/17 14:56:10 标签: java

方式一

new Specification匿名内部类,通过实现该匿名内部类的toPredicate方法构建查询sql

java">Specification<T> specification = new Specification<T>() {
	@Override
	public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
			List<Predicate> predicateList = new ArrayList<Predicate>();
			predicateList.add(cb.equal(root.get("col1").as(String.class), "0"));
			predicateList.add(cb.equal(root.get("col2").as(String.class), "5"));
			predicateList.add(cb.equal(root.get("col3").as(String.class), t));
			// 构建(col4 != '24' or col3 is null)条件
			predicateList.add(cb.or(cb.notEqual(root.get("col4").as(String.class), "24"),
                        cb.isNull(root.get("col4").as(String.class))));
			if (map.get("col4") != null){
				predicateList.add(cb.equal(root.get("col4").as(String.class), map.get("col4")));
			}

			if (map.get("col5") != null){
				predicateList.add(cb.equal(root.get("col5").as(String.class), map.get("col5")));
			}

			if (map.get("col6") != null){
				predicateList.add(cb.equal(root.get("col6").as(String.class), map.get("col6")));
			}
			if (map.get("col7") != null){
				predicateList.add(cb.equal(root.get("col7").as(String.class), map.get("col7")));
			}
			if (map.get("col8") != null){
				predicateList.add(cb.like(root.get("col8").as(String.class), "%" + map.get("col8").toString().trim() + "%"));
			}
			if (map.get("col9") != null){
				Object obj = map.get("col9");
				if (obj instanceof List){
					List list = (List) obj;
					List<Integer> orgList = new ArrayList<>();
					list.forEach(o -> {
						if (o != null){
							try{
								orgList.add(Integer.valueOf(o.toString()));
							}catch (NumberFormatException e){
								log.error("传参col9格式错误");
							}
						}
					});
					if (!orgList.isEmpty()){
						predicateList.add(root.get("col").as(Integer.class).in(list));
					}
				}
			}
			Predicate[] p = new Predicate[predicateList.size()];
			query.where(predicateList.toArray(p));
			query.orderBy(cb.desc(root.get("id").as(Integer.class)));
			return query.getRestriction();
	}
	};

Pageable pageable = PageRequest.of(page, size);
// 得到查询结果
Page<T> pageResult = tDao.findAll(specification, pageable);

方式二

根据参数组装sql条件,设置对应位置参数。缺点:in查询支持比较麻烦

java">@PersistenceContext
private EntityManager entityManager;

// 构建in查询sql,使用list接收参数,为后续设置对应位置参数
Object obj = map.get("list");
if (obj instanceof List){
	sql.append(" and col in (");
	List orgList = (List) obj;
	orgList.forEach(o -> {
		queryCondition.add(o);
	});
	sql.append(orgList.stream().map(o -> "?").collect(Collectors.joining(","))).append(")");
}

// 普通查询条件构建
if (!isNullOrBlank(String.valueOf(map.get("col2")))) {
	sql.append(" and col2= ?");
	queryCondition.add(map.get("col2"));
}

// 根据sql List<Object> queryCondition list,
Query query = entityManager.createNativeQuery(sql,clazz);
query.setFirstResult((int) pageable.getOffset());
query.setMaxResults(pageable.getPageSize());

for (int batch = 0; batch < queryCondition.size(); batch++) {
	query.setParameter(batch + 1,queryCondition.get(batch));
}


http://www.niftyadmin.cn/n/5242649.html

相关文章

【JavaEE进阶】 Spring 的创建和使⽤

文章目录 &#x1f334;前言&#x1f38b;创建 Spring 项⽬&#x1f6a9;创建⼀个 Maven 项⽬&#x1f6a9;添加 Spring 框架⽀持&#x1f6a9;添加启动类 &#x1f333;存储 Bean 对象&#x1f6a9;创建Bean&#x1f6a9;将 Bean 注册到容器 &#x1f332;获取并使⽤ Bean 对象…

@Component 和 @Bean 和 @configuration的区别

从位置上确定了每个注解的区别 从注解的位置上来确定这三个注解的区别&#xff0c;我们可以看到它们的应用场景和作用不同。 Component注解&#xff1a; Component注解是标记在类级别上的注解&#xff0c;用于将一个类标识为Spring容器的组件。通过组件扫描&#xff08;compon…

网络安全威胁——跨站脚本攻击

跨站脚本攻击 1. 定义2. 跨站脚本攻击如何工作3. 跨站脚本攻击类型4. 如何防止跨站脚本攻击 1. 定义 跨站脚本攻击&#xff08;Cross-site Scripting&#xff0c;通常称为XSS&#xff09;&#xff0c;是一种典型的Web程序漏洞利用攻击&#xff0c;在线论坛、博客、留言板等共享…

ApplicationContextAware 类

优质博文&#xff1a;IT-BLOG-CN 需求&#xff1a; 使用autowired注入一些对象&#xff0c;但发现不可以直接使用Autowired&#xff0c;因为方法是static的&#xff0c;要使用该方法当前对象也必须是static&#xff0c;正常情况下Autowired无法注入静态的bean&#xff0c;于是…

Python 元组教程:更新,解包,遍历,合并和内置方法

更新元组 更改元组的值 元组是不可更改的&#xff0c;但有一种变通方法。您可以将元组转换为列表&#xff0c;更改列表&#xff0c;然后将列表转换回元组。 示例&#xff1a; x ("apple", "banana", "cherry") y list(x) y[1] "kiwi…

Python中读写CSV文件的深入探讨

目录 一、引言 二、如何读取CSV文件 三、如何写入CSV文件 四、处理大型CSV文件 五、总结 一、引言 CSV&#xff08;Comma-Separated Values&#xff09;文件是一种常见的逗号分隔值格式的文件&#xff0c;常用于存储和传输数据。在Python中&#xff0c;我们可以使用内置的…

用100ask 6ull配合 飞凌 elf1的教程进行学习的记录 - ap3216

100ask板子 不用改 ap3216.c "ap3216creg.h" 添加到drivers/misc 从这抄的: https://gitee.com/flameboyence/linux_driver_example/tree/master/22_i2c #include <linux/types.h> #include <linux/kernel.h> #include <linux/delay.h> #includ…

MySQL生僻字修改编码utf8mb4

1、查看你编码 SHOW VARIABLES WHERE Variable_name LIKE character_set_% OR Variable_name LIKE collation%;&#xff08;如果不是下图则继续&#xff09; 2、修改默认参数 /etc/my.cnf [mysqld] datadir/usr/local/mysql/data basedir/usr/local/mysql socket/usr/local/my…