JPA CriteriaBuilder子查询方式

目录
  • JPA CriteriaBuilder子查询
  • Jpa在CriteriaBuilder中添加where条件NotIn子查询

JPA CriteriaBuilder子查询

给自己做个备忘

/** 检索关键字 */
if (keyWord != null && !keyWord.trim().equals(""))
{
    // 创建子查询对象
 Subquery<Store> subquery = criteriaQuery.subquery(Store.class);
 Root<Store> root2 = subquery.from(Store.class);
 subquery.select(root2.<Store> get("id"));
 subquery.where(criteriaBuilder.like(root2.<String> get("name"), "%" + keyWord + "%"));

 // 给读者稍微解释一下,也给自己留个记忆
    // 这里的意图是将关键做两个模糊检索,一个是在本表中检索title字段
    // 就是criteriaBuilder.like(root.<String> get("title"), "%" + keyWord + "%")
    // 二是将字段与子表中的检索出来的id与本表中store字段做匹配
    // criteriaBuilder.in(root.get("store")).value(subquery))
    // 至于id怎么检索出来的,用子查询模糊检索出来的,参照上面的子查询
 restrictions = criteriaBuilder.and(restrictions,criteriaBuilder.or(criteriaBuilder.like(root.<String> get("title"), "%" + keyWord + "%"),criteriaBuilder.in(root.get("store")).value(subquery)));
}

Jpa在CriteriaBuilder中添加where条件NotIn子查询

final CriteriaBuilder cb = entityManager.getCriteriaBuilder();
final CriteriaQuery<Person> cq = cb.createQuery(Person.class);
final Root<Person> root = cq.from(Person.class);
cq.select(root);
final Subquery<Integer> subquery = cq.subquery(Integer.class);
final Root<Person> validityIDSQ = subquery.from(Person.class);
subquery.select(cb.max(validityIDSQ.get(Person_.validityID)));
subquery.groupBy(validityIDSQ.get(Person_.personID));
cq.where(cb.in(root.get(Person_.validityID)).value(subquery));
// 将生成
select
    person0_.id as id1_0_,
    person0_.personID as personID2_0_,
    person0_.validityID as validity3_0_,
    person0_.value as value4_0_
from
    person person0_
where
    person0_.validityID in (
            select
                max(person1_.validityID)
            from
                person person1_
            group by
                person1_.personID)

自身所需NotIn语法,所以是

Subquery<String> manageUserSubquery = query.subquery(String.class);
                Root<RelationUserManagePlateDomain> relationUserManagePlateDomainRoot = manageUserSubquery.from(RelationUserManagePlateDomain.class);
                Join<RelationUserManagePlateDomain, UserDomain> relationUserManagePlateDomainUserDomainJoin = relationUserManagePlateDomainRoot.join(RelationUserManagePlateDomain_.user, JoinType.INNER);
                Subquery<String> subquery = manageUserSubquery.select(relationUserManagePlateDomainUserDomainJoin.get(UserDomain_.id));
                Predicate predicate1 = criteriaBuilder.and(criteriaBuilder.not(criteriaBuilder.in(root.get(UserDomain_.id)).value(manageUserSubquery)));
                predicate.getExpressions().add(predicate1);

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • JPA的多表复杂查询的方法示例

    最近工作中由于要求只能用hibernate+jpa 与数据库进行交互,在简单查询中,jpa继承CrudRepository接口 ,然后利用jpa的方法命名规范进行jpql查询,然而在进行复杂查询时,需要继承JpaSpecificationExecutor接口 利用Specification 进行复杂查询,由于我自己就遇到了这一问题,查了好多资料,虽然有方法,但是都没有一个详细的讲解,以至于知道方法而不能很好的利用jpa复杂查询的方便之处.我将举几个栗子,来详细的说一下我自己在使用jpa多表复杂查

  • springboot 之jpa高级查询操作

    springboot的jpa可以根据方法名自动解析sql 非常方便, 只需要在 dao接口中定义方法即可; 下面是一个 demo package com.bus365.root.dao; import java.io.Serializable; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.reposi

  • Spring Data JPA实现动态查询的两种方法

    前言 一般在写业务接口的过程中,很有可能需要实现可以动态组合各种查询条件的接口.如果我们根据一种查询条件组合一个方法的做法来写,那么将会有大量方法存在,繁琐,维护起来相当困难.想要实现动态查询,其实就是要实现拼接SQL语句.无论实现如何复杂,基本都是包括select的字段,from或者join的表,where或者having的条件.在Spring Data JPA有两种方法可以实现查询条件的动态查询,两种方法都用到了Criteria API. Criteria API 这套API可用于构建对数据

  • JPA CriteriaBuilder子查询方式

    目录 JPA CriteriaBuilder子查询 Jpa在CriteriaBuilder中添加where条件NotIn子查询 JPA CriteriaBuilder子查询 给自己做个备忘 /** 检索关键字 */ if (keyWord != null && !keyWord.trim().equals("")) { // 创建子查询对象 Subquery<Store> subquery = criteriaQuery.subquery(Store.cla

  • JPA CriteriaBuilder子查询方式

    目录 JPA CriteriaBuilder子查询 Jpa 在CriteriaBuilder中添加where条件NotIn子查询 JPA CriteriaBuilder子查询 给自己做个备忘 /** 检索关键字 */ if (keyWord != null && !keyWord.trim().equals("")) { // 创建子查询对象 Subquery<Store> subquery = criteriaQuery.subquery(Store.cl

  • 在SQL Server中使用子查询更新语句

    测试环境准备 create table #table1 ( id int , name varchar(20) ); go create table #table2 ( id int , name varchar(20) ); go insert into #table1 ( id, name ) values ( 1, 'a' ), ( 2, null ), ( 3, 'c' ), ( 4, 'd' ), ( 5, 'e' ); insert into #table2 ( id, name )

  • Spring JPA使用CriteriaBuilder动态构造查询方式

    目录 Spring JPA使用CriteriaBuilder动态构造查询 JPA CriteriaBuilder中一些运算的使用 Spring JPA使用CriteriaBuilder动态构造查询 在使用Spring JPA提供的方法只能进行简单的CRUD,如果遇到复杂的情况就需要我们动态来构建查询条件了.这里我们来看使用CriteriaBuilder如何来构造查询. 核心代码: CriteriaBuilder criteriaBuilder = entityManager.getCriteri

  • Spring Data JPA查询方式及方法名查询规则介绍

    目录 Spring Data JPA查询方式及方法名查询规则 一.通过解析方法名创建查询 二.使用 @Query 创建查询 JPA 常用查询方法记录 CrudRepository 默认带的查询方法 简单的扩展-以字段为关键字进行查询 使用@Query 进行复杂查询 使用 Specification 进行复杂查询 Predicate CriteriaBuilder Root Spring Data JPA查询方式及方法名查询规则 Spring Data JPA 一.通过解析方法名创建查询 在执行查

  • Spring Data Jpa的四种查询方式详解

    这篇文章主要介绍了Spring Data Jpa的四种查询方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.调用接口的方式 1.基本介绍 通过调用接口里的方法查询,需要我们自定义的接口继承Spring Data Jpa规定的接口 public interface UserDao extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User> 使用这

  • Spring Data Jpa多表查询返回自定义实体方式

    目录 SpringDataJpa多表查询返回自定义实体 Repository 好下面到单元测试 自定义实体 SpringDataJpa多表查询返回自定义VO的问题 下面是我的代码 下面是我的dao层,重点 SpringDataJpa多表查询返回自定义实体 比如来看一下这样的一条SQL语句,这是一个三张表的多表查询,显然在JPA中用一个实体类是接受不了这些参数的 select  t1.id as chapterId , t1.name as chapterName , t2.id as unitI

  • Mysql子查询关键字的使用方式(exists)

    目录 1. all 1.1 格式 1.2 特点 1.3 操作 2. any(some) 1.1 格式 1.2 特点 1.3 操作 3. in 1.1 格式 1.2 特点 1.3 操作 4. exist 1.1 格式 1.2 特点 1.3 操作 1.4 解释 1. all 1.1 格式 1.2 特点 all:与子查询返回的所有值比较为true则返回true all可以与=,>=,>,<,<=,<>结合使用,分别表示等于,大于等于,大于,小于,小于等于,不等于其中的所有数据

  • jpa EntityManager 复杂查询实例

    目录 jpa EntityManager复杂查询 概念 1. 注入entitymanager 2. 建立连接,执行查询操作 拓展 基于EntityManager的使用 1.最基础的查询 2.spring data jpa的toPredicate方法 jpa EntityManager复杂查询 概念 EntityManager:EntityManager是JPA中用于增删改查的接口,它的作用相当于一座桥梁,连接内存中的java对象和数据库的数据存储.可以用getCriteriaBuilder()的

  • Spingboot JPA CriteriaBuilder 如何获取指定字段

    目录 Spingboot JPA CriteriaBuilder获取指定字段 Java JPA CriteriaBuilder使用 一个复杂的查询例子 Spingboot JPA CriteriaBuilder获取指定字段 废话不说直接贴代码 public class ActivityVO implements Serializable { private static final long serialVersionUID = 1L; private int id; private Strin

随机推荐