spring JPA 中IN 的用法

Spring Data JPA用法详解 Spring Data JPA: JPA(Java Persistence API)即java持久化API,它的出现主要是为了简化持久层开发以及整合ORM技术,结束Hibernate、TopLink、JDO等ORM框架各自为营的局面。JPA是在吸收现有ORM框架的基础上发展而来,易于使用,伸缩性强。总的来说,JPA包括以下三方面的技术: ORM映射元数据:支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系 API:操作实体对象来执行CRUD操作 查询语言:通过面向对象而非面向数据库的 阅读详情

一些语法并不向mybatis那样灵活,写起来也是很费劲

1. 查询条件

比如:

        要实现某个查询条件,要满足

1. 改字段为空的场景,

2. 该字段不为空,但是要根据该条件再过滤一次的场景

2. 常规的sql两种实现方法

① select * from  a   A where A.sys_id is null union select * from a A  where A.sys_id is not null and A.sys_id in (select id from B where ..... );

② select * from  a   A where  A.sys_id is null or   A.sys_id in (select id from B where ..... );

以上两种sql对比,如果条件较少,①还可以,如果条件较多,并不怎么好写,同时性能

union要进行一次去重的操作。

我这个表大概50W条数据,而且不重复。所以系统每插入一条数据,就要走全表查一次索引,50W条数据就要查50W次,当然卡死。

提出建议:使用union all。这样就不会走去重的逻辑了。

因此想到了使用sql②,但是用jpa的sql语法并不像mybatis的写法那么灵活,该怎么写呢?

3 以下是jpa的sql

select ftagentpo0_.agentid as agentid1_1_, ftagentpo0_.clusterstate as clusters2_1_, ftagentpo0_.description as descript3_1_, ftagentpo0_.hport as hport4_1_, ftagentpo0_.agentip as agentip5_1_, ftagentpo0_.ismonitor as ismonito6_1_, ftagentpo0_.ismanually as ismanual7_1_, ftagentpo0_.agentname as agentnam8_1_, ftagentpo0_.password as password9_1_, ftagentpo0_.port as port10_1_, ftagentpo0_.priority as priorit11_1_, ftagentpo0_.serverid as serveri12_1_, ftagentpo0_.status as status13_1_, ftagentpo0_.sysid as sysid14_1_, ftagentpo0_.transferstatus as transfe15_1_, ftagentpo0_.updatetime as updatet16_1_, ftagentpo0_.agentver as agentve17_1_ from ft_agent ftagentpo0_ where ftagentpo0_.transferstatus=? and (ftagentpo0_.sysid is null or ftagentpo0_.sysid in (select ftsyspo1_.id from ft_sys ftsyspo1_ where ftsyspo1_.userid=?)) order by ftagentpo0_.sysid desc, ftagentpo0_.status asc, ftagentpo0_.agentid desc limit ?

4. 代码实现

protected Specification<FtAgentPO> createSpec(FtAgentPO.Criteria criteria,String type) {
        Specification<FtAgentPO> spec = (root, query, builder) -> {
            if (criteria == null) {
                return builder.and(new Predicate[]{});
            }
            List<Predicate> predicates = new ArrayList<Predicate>();
            Optional.ofNullable(criteria.getSysId()).ifPresent((value) -> predicates.add(builder.equal(root.get("sysId"), value)));
            Optional.ofNullable(criteria.getServerId()).ifPresent((value) -> predicates.add(builder.equal(root.get("serverId"), value)));
            Optional.ofNullable(criteria.getIp()).ifPresent((value) -> predicates.add(JPAPredicateHelper.like(builder, root.get("ip"), value)));
            Optional.ofNullable(criteria.getStatus()).ifPresent((value) -> predicates.add(builder.equal(root.get("status"), value)));
            Optional.ofNullable(criteria.getZone()).ifPresent((value) -> predicates.add(builder.equal(root.get("zone"), value)));
            Optional.ofNullable(criteria.getEnv()).ifPresent((value) -> predicates.add(builder.equal(root.get("env"), value)));
            Optional.ofNullable(criteria.getClusterState()).ifPresent((value) -> predicates.add(builder.equal(root.get("clusterState"), value)));
            if(type.equals("eq")){
                Optional.ofNullable(criteria.getName()).ifPresent((value) -> predicates.add(builder.equal(root.get("name"), value)));
            }else {
                Optional.ofNullable(criteria.getName()).ifPresent((value) -> predicates.add(JPAPredicateHelper.like(builder, root.get("name"), value)));
            }
            Optional.ofNullable(criteria.getTransferStatus()).ifPresent((value) -> predicates.add(builder.equal(root.get("transferStatus"), value)));
            if (criteria.getSysIdIsNull() != null) {
                if (criteria.getSysIdIsNull()) {
                    predicates.add(builder.isNull(root.get("sysId")));
                } else {
                    predicates.add(builder.isNotNull(root.get("sysId")));
                    handleUserSys(root, query, builder, predicates);
                }
            } else {
                handleUserSys(root, query, builder, predicates);
            }
            return builder.and(predicates.toArray(new Predicate[predicates.size()]));
        };
        return spec;
    }
   private void handleUserSys(Root<FtAgentPO> root, CriteriaQuery<?> query, CriteriaBuilder builder, List<Predicate> predicates) {
        if (!BFTModelHelper.checkAdmin()){
            String userId = BFTModelHelper.getUserId();

            Subquery<String> subsubquery = query.subquery(String.class);
            Root<FtSysPO> subsubroot = subsubquery.from(FtSysPO.class);
            subsubquery.select(subsubroot.get("id"));
            subsubquery.where(builder.equal(subsubroot.get("userId"), userId));

            Predicate managePredicate = builder.or(
                    builder.isNull(root.get("sysId")),
                    root.get("sysId").in(subsubquery)
            );
            predicates.add(managePredicate);
        }
    }

主要是以上的sql写法。

JPA & Spring Data JPA详解 JPA & Spring Data JPA 一、JPA 1. JPA是什么 JPA(Java Persistence API)Java持久化 API,是一套基于ORM思想的规范。 ORM(Object Relational Mapping)对象关系映射。实现了实体类对象和数据库中表的一个映射关系。我们可以通过操作实体类对象(JavaBean)来操作数据库表,从而实现数据库的CRUD操作并且不需要去重点关注SQL语句。ORM主要涉及到两个映射关系:1、实体类和表的映射关系;2、实体类中的属性和表中的字 阅读详情

相关推荐

Spring Boot整合Spring Data JPA详解

Spring Boot整合Spring Data JPA理解 官方文档: Spring Data JPA 官方文档 一、 Sping Data JPA 简介 在此之前我们首先来认识一下,**Spring Data JPA** 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的JPA 应用框架,底层使用了 Hibernate 的 JPA 技术实现,Spring Data JP...

王某人 6766

jpa的in查询

jpa 中 in 语句的写法 一) in (List)     @Modifying     @Query("DELETE FROM Height h WHERE h.user.id = ?1 AND h.id in (?2)")     public void deleteHeightInBatchByUserIdAndIdIn(Long uid, List hids);

u010951508的专栏 5万+

杂货店商品数据集挖掘关联规则实验

(2)选择事务集中前100条事务,选择合适的支持度阈值,使用Apriori算法和FP-growth算法挖掘频繁项集(推荐使用mlxtend包的apriori和fpgrowth函数),并对比apriori算法和fpgrowth算法的时间复杂度;(比如用户1000在2015年3月15日对应的事务为{‘sausage’,’whole milk’,’semi-finished bread’,’yogurt’}),然后按照用户ID递增,时间递增的方式对事务进行排序;7. 排版工整自洽,图表标题准确(10分)

m0_62500122的博客 1441

hdu 1213 How Many Tables(并查集+路径压缩)

传送门 题目: Problem Description Today is Ignatius’ birthday. He invites a lot of friends. Now it’s dinner time. Ignatius wants to know how many tables he needs at least. You have to notice that not all the friends know each other, and all the friends do not wa

Lzhzl211的博客 608

MDB协议中设备级别和选项(Levels and Options)

MDB协议的LEVEL级别介绍

hbstart的博客 939

三极管和MOS管工作原理详解

PN结的形成 PN结是三极管以及场效应管中最基本的组成部分,要想彻底搞明白三极管以及场效应管的工作原理,必须先搞清楚PN结形成的原理和工作特性。 本征半导体以及空穴对 本征半导体(intrinsic semiconductor))完全不含杂质且无晶格缺陷的纯净半导体称为本征半导体。主要常见代表有硅、锗这两种元素的单晶体结构。硅、锗都是4价原子,在半导体内部形成相对稳定的共价键结构,如图 1所

技术交流是便宜的的博客 10万+

jpa复杂查询、条件查询、in查询

Page<Question> questionPage = questionRepository.findAll((root, query, cb) ->{ List<Predicate> predicateList = Lists.newArrayList(); predicateList.add(cb.equal(root.get("status"),1)); predicateList.add(cb.in(root.get("handle"))..

ClaireCheney的博客 6707

Zephyr RTOS线程间通讯实战:消息队列与信号量的5个经典应用场景

本文深入探讨了Zephyr RTOS中线程间通讯的核心机制,通过消息队列与信号量的组合,详细解析了传感器数据处理流水线、命令分发系统、日志记录、资源池管理以及周期性任务协同调度等5个经典应用场景。这些实战模式为构建高效、稳定且可维护的嵌入式多线程系统提供了清晰的设计蓝图和代码范例。

tomato的博客 95

jpa in的用法

@Query(value = "SELECT phone FROM contact_phone WHERE group_id IN (:ids)",nativeQuery = true) List<String> getPhoneListByGroupId(@Param("ids") List<String> ids);

大户影视的博客 5306

Xilinx PCIe IP核示例工程仿真流程与关键任务解析

本文详细解析了Xilinx PCIe IP核示例工程的仿真流程与关键任务。通过搭建仿真环境、解读初始化日志,并深入剖析TSK_TX_MEMORY_WRITE_32等核心任务的TLP报文生成与交互过程,帮助开发者掌握PCIe IP核的仿真调试方法,为实际硬件设计提供可靠的验证基础。

weixin_28314575的博客 508

标准测试测试数据STDF学习笔记

本文介绍了STDF(Standard Test Data Format)文件的结构与解析方法。首先详细说明了STDF记录的组成,包括记录头类型(REC_TYP和REC_SUB)、数据类型定义、时间日期格式以及无效数据标识。重点分析了25种主要记录类型的功能、数据内容和出现位置,如FAR、MIR、MRR等关键记录。然后介绍了基于pystdf开源工具的解析方法,包括自带脚本的使用和自编程解析流程,通过事件驱动机制处理数据流。特别指出测试数据是按照PIR→PTR/MPR/FTR→PRR的循环模式组织。文章为ATE

歌颂苦难的行为是无耻的; 1513

JPA IN用法

public Page<ConsignmentV> getList(String orgFirstId,String orgSecondId, String beginDate,String endDate,Integer page, Integer size,Integer status,String state) { Specification<ConsignmentV> specification = new Speci...

qq690452074的专栏 4045

Windows 下 Codex 安装全记录:从零到一的保姆级图文教程

本文主要介绍了Windows 下 Codex 安装全记录:从零到一的保姆级图文教程,希望能对学习使用 Codex 的同学们有所帮助。 文章目录 1. 背景 2. 实战教程 2.1 方案一 2.2 方案二 3. 报错解决方案

weixin_43178406的博客 14万+

spring data JPA 中带查询条件的分页in的用法

spring data JPA 中带查询条件的分页in的用法in的用法和equal,like,or的用法不同,以下给出in的用法!@Override public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {

学习达人的日记本 1万+

海康visionmaster-渲染结果:通过绑定流程或模块获取 渲染结果的方法

海康visionmaster-渲染结果:通过绑定流程或模块获取 渲染结果的方法

视觉人机器视觉的博客 2645

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

spring data JPA 中带查询条件的in的用法

public Page<Material> findByMaterialList(Long subjectId,Long subjectGroupId, Material material, Pageable pageable) { Subject subject = subjectRelationRepository.findOne(subjectId); long[] i...

xcc_2269861428的博客 7万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

后端开发 - Spring Data Jpa 中in between 的用法

JPA可以根据你写的一个函数名来生成对应的SQL语句,当然函数名是要符合特定规则的。 这里介绍between和in的用法 between的用法 @Query(nativeQuery = true, value = "select * from z_cashier_data" + "where abstract_code = ?1 ...

张念磊的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Spring-data-jpa 之Specification in的用法

1.一个简单的Predicate 的示例 构建简单的Predicate示例: Predicate p1=cb.like(root.get(“name”).as(String.class), “%”+uqm.getName()+“%”); Predicate p2=cb.equal(root.get...

weixin_34363171的博客 692

Spring Data JPA 使用JpaSpecificationExecutor实现多条件查询2 in的用法(含于)

之前写过一篇Spring Data JPA 使用JpaSpecificationExecutor实现多条件查询(分页查询和非分页查询),但是筛选条件都是单一的,并不存在包含关系,例如我传ID[1,2,3],希望找到ID是这里面其中一个的所有记录。这时候就需要使用in。 示例场景:根据项目名称查询人员,但是人员表中只有一个项目ID,也即,首先需要通过项目名称模糊查询到对应的项目ID列表,再通过这个ID列表去筛选人员。 代码: 筛选条件方法,使用in: private Specification<User

yogima的博客 2518

spring data jpa 动态查询Specification(包括各个In、like、Between等等各种工具类,及完整(分页查询)用法步骤(到返回给前端的结果))

目录 一、 二、工具类 1、AbstractSpecification(抽象动态查询条件) 2、各属性查询条件(IsNull、In、Number、String、Like等) (1)字符串属性查询条件StringSpecification (2)、Between动态查询条件BetweenSpecification (3)相等动态查询条件EqualSp...

AmbroseLe 2万+

Spring Data Jpa 动态查询Specification的基本用法

在平常的使用中,我们往往要根据前端传过来的参数(参数个数不确定)动态查询一些数据。 下文就介绍一下在Spring Data Jpa中动态查询的基本用法。 一、dao层的Repository继承JpaRepository 例: public interface UserInfoRepository extends JpaRepository<T, Long>, JpaSpecificationExecutor<T> { } 二、在需要查询的service类中注入Reposi

Rookie_cc的博客 3228

JPA cb.or 或查询 Predicate QBC查询 CriteriaBuilder子查询 CriteriaBuilder之in及not in @Query in ArrayList初始化

常用查询:equal(等于),notEqual(不等于), gt(大于), ge(大于等于),lt(小于), le(小于等于),between(闭区间中的值),like(模糊)等 predicates.add(cb.or(cb.like(root.get("productName"),"%" + name + "%"), cb.like(root.get("productBarcode"),"%" + name + "%"))); ...

tanzongbiao的专栏 4303

Spring boot JPA 查询使用in(value1,value2,...)

在使用Spring boot JPA查询时,我们有时候会涉及到使用in的需求,相信很多小伙伴第一次使用的时候会手足无措:这个该怎么办呢? 下面就是in的用法: 1.先根据该属性创建in CriteriaBuilder.In<Object> in = cb.in(root.get("id")); 2.获取你要的(value1,value2,...)集合 List<Ob...

Java小白的进阶之路 9376

Spring Data JPA

快速入门spring data jpa,并且集成到Springboot

llg3189609554的博客 1432
上一篇: Windows 搭建 RocketMq采坑
下一篇: ES之常用踩坑用法
@清风明月情@
博客等级 码龄10年 52粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值