JPA使用Java代码进行复杂查询、多重查询
Specification<Place> spec = new Specification<Place>() { @Override public Predicate toPredicate(Root<Place> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) { List<Predicate> predicateList = new ArrayList<>(); //0.这条数据某个属性等于特定参数值 String exam_id = "0"; if (!TextUtils.isEmpty(exam_id)) { predicateList.add(criteriaBuilder.equal(root.get("exam_id").as(String.class), exam_id)); } //1,模糊查询、某个字段包含特定参数值 String place_name = "湖南考点"; if (!TextUtils.isEmpty(place_name)) { String pattern = "%" + place_name + "%"; predicateList.add(criteriaBuilder.like(root.get("place_name").as(String.class), pattern));//包含 包含条件 }
//某个字段的int值小于某个特定值
Predicate isCommit = criteriaBuilder.lessThan(root.get("state").as(Integer.class), 100);
//某个字段被包含于某个数组或集合中
String [] placeIds = {"0","1"};
if (placeIds.size() > 0) {
Path<String> path = root.get("place_id");//定义查询的字段
CriteriaBuilder.In<String> in = criteriaBuilder.in(path);
for (int i = 0; i < placeIds.size(); i++) {
in.value(placeIds.get(i));//存入值
}
predicateList.add(in);
}
//判断某个字段是不是为NULL
if (req.condition.isAssign != BoolState.DEFULT) {
Path<String> path = root.get("room_id");//定义查询的字段
if (req.condition.isAssign == BoolState.YES) {
predicateList.add(criteriaBuilder.isNotNull(path));
} else {
predicateList.add(criteriaBuilder.isNull(path));
}
}
//在某个时间段内
Date toDateFromFromStr = DateUtils.stringToDate(starttime, "yyyy-MM-dd");
Date toDateEndFromStr = DateUtils.stringToDate(endtime, "yyyy-MM-dd");
Predicate like2 = criteriaBuilder.between(root.get("showtime").as(Date.class), toDateFromFromStr, toDateEndFromStr);
predicateList.add(like2 );
Predicate[] pre = new Predicate[predicateList.size()];
pre = predicateList.toArray(pre);
return criteriaQuery.where(pre).getRestriction(); }
};
PageRequest pageReques = PageRequest.of(req.curPage=0, req.pageSize=10);//分页查询
Long count = enrollRepository.count(spec);
Page<Place> pages = enrollRepository.findAll(spec, pageReques);//分页、多条件查询
List<Place> enrollList = pages.getContent();
Map map = new LinkedHashMap();
map.put("total", count);
map.put("list", enrollList);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理