Writing Strongly Typed NOT IN Subqueries with JPA CriteriaBuilder
This one took a while to figure out and it required a few beers.
Let’s say you have an entity called Product and an entity called ProductOwner and there is a 1 to n relationship from ProductOwner to Product but you can only access Product from ProductOwner.
This may not be the way the database is designed – that would be terrible, but it may be the way your model has been designed. Probably an oversight but in any case, now you’re stuck with it.
What do you do if you want find out how many ProductOwners don’t actually own any products? It can happen, but because of the design of the model, it’s not obvious how to fetch those records.
In SQL, it’s easy…
select * from ProductOwner po where po.id not in (select p.id from product)
Using JPA CriteriaBuilder you would do the following.
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<ProductOwner> query = cb.createQuery(ProductOwner.class); Root<ProductOwner> poRoot = query.from(ProductOwner.class); query.select(poRoot); Subquery<Product> subquery = query.subquery(Product.class); Root<Product> subRoot = subquery.from(Product.class); subquery.select(subRoot); Predicate p = cb.equal(subRoot.get(Product_.productOwner),poRoot); subquery.where(p); query.where(cb.not(cb.exists(subquery))); TypedQuery<ProductOwner> typedQuery = entityManager.createQuery(query); List<ProductOwner> result = typedQuery.getResultList();
相关推荐
Learn to use the Java Persistence API (JPA) and other related APIs as found in the Java EE 8 platform from the perspective of one of the specification creators. A one-of-a-kind resource, this in-depth...
public Predicate toPredicate(Root<MonitorLog> root, javax.persistence.criteria.CriteriaQuery<?> query, CriteriaBuilder cb) { List<Predicate> lstPredicates = new ArrayList(); if (StringUtils....
jpa in action pdf 中文 不是真实这个系列的,是我自己写的。虽然很多地方语句不通顺,不过也很用心,花了很长时间写的,看看还是可以的。(主要我语文太差了,打小语文就不好)请勿转载 写的很一般,等做完手里的...
**Java Persistence API (JPA)** 是Java平台上的一个标准,用于管理关系数据库中的对象-关系映射(ORM)。它提供了一种方式,让开发者可以用面向对象的编程模型来操作数据库,而无需直接编写SQL语句。JPA允许你在...
**JPA(Java Persistence API)**是Java平台上的一个标准,用于管理关系数据库中的数据,它简化了在Java应用程序中存储、检索和管理对象的工作。JPA是Java EE和Java SE环境中的一种ORM(Object-Relational Mapping)...
在本文中,我们将深入探讨如何在Spring Boot项目中利用Java Persistence API (JPA) 实现分页和动态多条件查询,并结合Thymeleaf模板引擎展示数据。Spring Boot以其简化配置和快速启动的优势,已经成为现代Java开发的...
### SAP JPA 1.0, EJB 3.0 和 Web Service - 构建您的第一个 JPA 实体在 CE 7.1 #### 引言 本文将详细介绍如何通过一个简单的员工数据模型来创建、配置、调用并部署一个 SAP JPA 1.0 实体。我们的示例应用仅包含一...
Spring 和 OpenJPA 集成是企业级Java开发中常见的技术组合,主要用于构建数据持久化层。Spring 是一个强大的轻量级应用框架,而 OpenJPA 是一个开源的 Java Persistence API (JPA) 实现,它允许开发者将对象关系映射...
**Java Persistence API (JPA)** 是Java平台上的一个标准,用于管理关系数据库中的数据。它为Java开发者提供了一种对象关系映射(ORM)机制,将业务对象与数据库表进行映射,使得开发者可以使用面向对象的方式来操作...
Java Persistence API(JPA)是Java平台上的一个标准,用于管理关系数据库中的对象持久化。它简化了在Java应用程序中存储、检索和管理数据的过程,是Enterprise JavaBeans(EJB)的一部分,也是Spring框架中的一个...
**Spring Data JPA** 是一个基于 **Java** 的开源框架,它是 **Spring Framework** 的一个模块,主要用于简化 **Java Persistence API (JPA)** 的使用。JPA 是 Java 平台上的一个标准,用于管理和持久化应用程序的...
《Pro JPA2:精通Java™ Persistence API》是一本由Mike Keith和Merrick Schincariol撰写的关于Java持久化API(JPA)的权威指南。本书深入探讨了JPA2,即Java Persistence API的第二版,是Java EE 6标准的一部分。...
Spring框架的核心特性包括依赖注入(DI)和面向切面编程(AOP),并且它还提供了对数据库操作的支持,这主要通过Spring Data JPA和Java Persistence API(JPA)实现。 Spring注解是Spring框架中的一大特色,它极大...
`CriteriaQuery`和`CriteriaBuilder`是JPA提供的API,用于构建HQL(Hibernate Query Language)表达式,这使得我们可以在运行时构建灵活的查询。 在实际应用中,你可能会遇到更多复杂的查询需求,例如嵌套的分页...
### JPA概述与核心知识点详解 #### 一、JPA概览 JPA,全称Java Persistence API,作为Java EE 5.0平台标准的ORM(Object-Relational Mapping)规范,旨在解决对象持久化问题,使开发人员能更轻松地在Java应用程序...
Spring Data JPA API。 Spring Data JPA 开发文档。 官网 Spring Data JPA API。
Spring Data JPA 是一个由 Spring 框架提供的强大库,它极大地简化了基于 Java Persistence API (JPA) 的数据库访问。JPA 是 Java 平台上的标准 ORM(对象关系映射)规范,允许开发者使用面向对象的方式处理数据库...
Spring Data JPA 是一个强大的框架,它简化了Java应用程序与数据库之间的交互,是Spring生态中的重要组成部分。通过使用Spring Data JPA,开发者可以避免编写大量的JPA(Java Persistence API)和SQL代码,专注于...