jpa EntityManager复杂查询怎么实现
发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,这篇文章主要讲解了"jpa EntityManager复杂查询怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"jpa EntityManager
千家信息网最后更新 2025年02月03日jpa EntityManager复杂查询怎么实现
这篇文章主要讲解了"jpa EntityManager复杂查询怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"jpa EntityManager复杂查询怎么实现"吧!
jpa EntityManager复杂查询
概念
EntityManager
:EntityManager是JPA中用于增删改查的接口,它的作用相当于一座桥梁,连接内存中的java对象和数据库的数据存储。可以用getCriteriaBuilder()的方式获取CriteriaBuilder对象。CriteriaBuilder
接口:用于构造标准查询、复合条件、表达式、排序等。可以通过createQuery的方式获取CriteriaQuery实例。CriteriaQuery
接口:代表一个specific的顶层查询对象,它包含着查询的各个部分,比如:select 、from、where、group by、order by。Root
接口:代表Criteria查询的根对象,定义了实体类型,能为将来导航获得想要的结果,它与SQL查询中的FROM子句类似
接下来上代码啦!
1. 注入entitymanager
@PersistenceContextprivate EntityManager em;
2. 建立连接,执行查询操作
CriteriaBuilder cb = em.getCriteriaBuilder();CriteriaQueryq = cb.createQuery(ADTO.class);Root root = q.from(A.class);/*********************表连接**************************/Join b = root.join("b", JoinType.LEFT);Join c = root.join("c", JoinType.LEFT);Join d = root.join("d", JoinType.LEFT);Join e = root.join("e", JoinType.LEFT);Join f = root.join("f", JoinType.LEFT);q.multiselect(//备注:ADTO要有对应构造函数哦 root.get("id"), root.get("version"), root.get("code"), root.get("name"), root.get("isAlterable"), root.get("mustCharge"), root.get("isConsignment"), root.get("memo"), b.get("id"), b.get("name"), c.get("id"), c.get("description"), d.get("id"), d.get("name"), e.get("id"), e.get("name"), f.get("id"), f.get("name"), root.get("standardPrice"), root.get("upperPrice"), root.get("lowerPrice"), root.get("isActive"));//还可以进行where.order by等操作哦List rs = em.createQuery(q).getResultList();
到此就完成啦!!!
拓展
where条件
Listpredicates = new ArrayList<>();CriteriaBuilder.In in = cb.in(root.get("code").as(String.class));for (String code: codes) { in.value(code);}predicates.add(in);if (startDate != null && !"".equals(startDate)) { predicateList.add(cb.greaterThan(birthdayPath, startDate));}Predicate[] pre = new Predicate[predicates.size()];q.where(predicates.toArray(pre));
or 条件拼接
public ListgetOrSearchPredicates(CriteriaBuilder cb, Root root, String keywords){ List predicates = new ArrayList<>(); Predicate predicate = null; Predicate predicate1 = null; try { UUID uuid = UUID.fromString(keywords); predicate1 = cb.equal(root.get("id"), uuid); }catch (Exception e){ log.info(e.getMessage()); }finally { Predicate predicate2 = cb.like(root.get("code"), "%"+keywords+"%"); Predicate predicate3 = cb.like(root.get("name"), "%"+keywords+"%"); if (predicate1 != null){ predicate = cb.or(predicate1, cb.or(predicate2,predicate3)); } else { predicate = cb.or(predicate2, predicate3); } } predicates.add(predicate); return predicates;}
JPA 动态更新
CriteriaBuilder cb=entityManager.getCriteriaBuilder();CriteriaUpdateop=cb.createCriteriaUpdate(clazz);Root root=op.from(clazz);op.set(fieldName, value);op.where(cb.equal(root.get(keyName), delta.get(keyName)));entityManager.createQuery(op).executeUpdate();
基于EntityManager的使用
1、最基础的查询
CriteriaBuilder cb = entityManager.getCriteriaBuilder();CriteriaQuerycq = cb.createQuery(User.class);Root root = cq.from(User.class); //from Usercq.select(root); //select * from Userjavax.persistence.criteria.Predicate pre = cb.equal(root.get("id").as(Integer.class),id);//id=1cq.where(pre);//where id=1Query query = entityManager.createQuery(cq);//select u from User u where u.id = 1System.out.println(query.getResultList());
2、spring data jpa的toPredicate方法
public Predicate toPredicate(Rootroot, CriteriaQuery> query, CriteriaBuilder cb) { List list = new ArrayList (); list.add(cb.equal(root.get("dr").as(Integer.class), delete)); if (StringUtils.isNotBlank(searchParam)) {/*searchParam 为传递参数*/ list.add(cb.or(cb.like(root.get("roleName").as(String.class), cb.literal("%" + searchParam + "%")), cb.like(root.get("roleCode").as(String.class), cb.literal("%" + searchParam + "%")))); } // 角色id if (roleId != null && !("".equals(roleId.trim()))) { list.add(cb.equal(root.get("id").as(String.class), roleId)); } // 管理员角色标识 if (category != null && category > 0) { list.add(cb.equal(root.get("category").as(Integer.class), category)); } //多角色Id if (roleids != null && roleids.size() > 0) { list.add(root.get("id").as(String.class).in(roleids)); } Predicate[] predicates = new Predicate[list.size()]; query.where(list.toArray(predicates)); query.orderBy(cb.asc(root.get("roleType").as(String.class)), cb.asc(root.get("roleProperty").as(String.class)), cb.asc(root.get("roleCode").as(String.class))); return query.getRestriction();}
参考 org.springframework.data.jpa.repository.support.SimpleJpaRepository 的 findAll方法,如下
public ListfindAll(Specification spec) { return getQuery(spec, (Sort) null).getResultList();}protected TypedQuery getQuery(Specification spec, Sort sort) { CriteriaBuilder builder = em.getCriteriaBuilder(); CriteriaQuery query = builder.createQuery(getDomainClass()); Root root = applySpecificationToCriteria(spec, query); query.select(root); if (sort != null) { query.orderBy(toOrders(sort, root, builder)); } return applyRepositoryMethodMetadata(em.createQuery(query));}private TypedQuery applyRepositoryMethodMetadata(TypedQuery query) { if (metadata == null) { return query; } LockModeType type = metadata.getLockModeType(); TypedQuery toReturn = type == null ? query : query.setLockMode(type); applyQueryHints(toReturn); return toReturn;}
感谢各位的阅读,以上就是"jpa EntityManager复杂查询怎么实现"的内容了,经过本文的学习后,相信大家对jpa EntityManager复杂查询怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
查询
复杂
对象
接口
条件
角色
学习
代表
内容
数据
方式
方法
接下来
一座
上代
作用
内存
函数
参数
可以通过
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
迪士尼宝可梦服务器下载
福州博盈网络技术有限公司
数据库整合定义
微数据库的数据格式
软件开发安全开场白
数据库中添加时间用什么控件
软件开发同业交流
天津网络技术开发价格查询
企业都有一个网络安全的部门吗
家庭教师电脑游戏软件开发
应用软件开发排行
服务器系统哪些好用
了人工智能围棋软件开发商
虾皮台湾本土店铺收款服务器
电脑软件开发如何入门
河北发展软件开发项目信息
大连软件开发业
网络进口游戏需要服务器在国内
网络安全信息化检查考核
wow影之哀伤服务器公会
有软件开发平台的公司有哪些
饥荒联机版服务器没有声音
所谓的中文综合性三大数据库
我的世界魔塔艾尔莉亚服务器
生成本地的数据库文件
莱芜智慧社区软件开发电话
浦东新区软件开发流程
什么协议用于访问文件服务器
建立乡镇数据库
福山区游戏软件开发公司