jpa EntityManager复杂查询怎么实现
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要讲解了"jpa EntityManager复杂查询怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"jpa EntityManager
千家信息网最后更新 2026年11月01日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安全错误
数据库的锁怎样保障安全
中关村互联网 科技集团
云信互联网科技有限公司
中关村互联网科技集团
互联网科技社
金融科技创新监管互联网金融
互联网科技公司怎么样
齐家互联网科技
汇久创客互联网科技
互联网科技大会
佩信高科技互联网
哈尔滨新华互联网科技学院
互联网科技寓意
恒生互联网科技指数跳水
洛阳昕诺飞互联网科技有限公司
西安小鹰速贷互联网科技有限公司
威龙国际互联网科技公司
伊宁互联网科技做什么的
科技和互联网行业的特点
黑龙江互联网科技公司
互联网科技创业计划的风险分析
精品咖啡豆
今日互联网科技
碳银互联网科技
盛创互联网科技有限公司
小米互联网科技园设置
互联网为啥属于高科技
高科技互联网套路
有人说阿里系是互联网科技企业
江苏互联网智能科技产品出厂价
科技互联网企业在行动