Network Security Internet Technology Development Database Servers Mobile Phone Android Software Apple Software Computer Software News IT Information

In addition to Weibo, there is also WeChat

Please pay attention

WeChat public account

Shulou

How to implement complex query in jpa EntityManager

2025-03-28 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Development >

Share

Shulou(Shulou.com)06/02 Report--

这篇文章主要讲解了"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();CriteriaQuery q = 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条件

List predicates = 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 List getOrSearchPredicates(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();CriteriaUpdate op=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();CriteriaQuery cq = 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(Root root, 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 List findAll(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复杂查询怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.

Views: 0

*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.

Share To

Development

Wechat

© 2024 shulou.com SLNews company. All rights reserved.

12
Report