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万+

ARM学习 | 紧耦合存储器 (TCM)

TCM 是一种专用的片上存储器,直接与处理器核心耦合。确定性访问:由于不涉及缓存替换或一致性管理,访问延迟固定。高带宽:TCM 通常通过专用总线连接处理器核心,可以提供更高的数据吞吐率。用户管理:TCM 的分配和管理完全由开发者控制,不依赖硬件缓存策略。ARM 处理器中的 TCM 通常分为ITCM(指令紧耦合存储器)和DTCM(数据紧耦合存储器),分别用于存储指令和数据。TCM 是 ARM 处理器中不可忽视的重要特性,在实时系统和高性能嵌入式应用中具有重要地位。

qq_43167806的博客 3329

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

⑨【从0制作自己的ros导航小车:上位机篇】04、使用gmapping建图

前面的文章已经能够实现在odom坐标系下显示小车模型和里程计数据了,本文加上激光slam必不可少的传感器雷达,先进行测试,然后直接开始建图!

海风的博客 2916

项目计划书、规划文档模板

项目计划书、规划文档模板 最近通过项目实践经历,整理出的一套项目计划书(仅供自己参考梳理思路使用) 有喜欢的文末加VX 辛苦码字如有转载请标明出处谢谢!——木研 更新的简版项目规划文档! 原版文件请+vx :baierfa ...

weixin_43194923的博客 990

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

Cisco 路由器 打环测试教程

环 回测试是很常用的一种测试,通常用于检查和分析端口或线路问题。如下图所示,我们在设备端口上用命令loopback(某些端口上命令格式为 loopback diagnostic)使接口从内部将自己发送的信号转接到自己的接收端(如红线所示),通过检查数据发送和接收的情况来判断端口工作状态是否正常。如果 需要对端口进行完全的检测,可以使用符合标准的短跳线将端口收发短接构成环...

weixin_34304013的博客 2024

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

QGis二次开发 —— 1、win10/win11搭建Vs2017-QGis3.40.12环境(附Vs2017环境效果,附全部问题解决方法)(附:Qt助手加入QGis接口说明文档)

QGis二次开发 —— 1、Windows10搭建Vs2017-QGis环境(附Vs2017环境效果)(附:Qt助手加入QGisA接口说明文档)

1362

Apache Kylin 命令注入漏洞复现(CVE-2020-1956)

Apache Kylin 中的静态 API 存在安全漏洞,可以将os命令与用户输入字符串连接起来,攻击者可以在Kylin没有任何保护或验证的情况下执行任何os命令。

0xSec 1558

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

《QGIS快速入门与应用基础》021:插件仓库 URL 获取与添加

详细介绍了在QGIS中添加第三方插件仓库的方法。首先强调必须从官方推荐、开源社区等可靠渠道获取插件仓库URL以确保安全性,并列出了4类可信获取渠道。文章分步骤讲解了URL添加流程,包括打开插件管理器设置面板、填写仓库信息、刷新缓存验证等操作。针对常见问题如URL格式错误、连接失败等提供了具体解决方案。最后总结指出,成功添加第三方仓库后即可直接搜索安装各类专业插件,从而扩展QGIS功能边界。全文注重实操指导,特别适合需要安装行业专用插件的QGIS用户参考。

LuckyHanMo的博客 466

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万+

攻克低照度检测难题:YOLOv11主干网络增强新方案PE-YOLO详解

编码器部分# 解码器部分self.dec_conv2 = nn.Conv2d(512, 128, 3, padding=1) # 跳跃连接self.dec_conv3 = nn.Conv2d(256, 64, 3, padding=1) # 跳跃连接self.dec_conv4 = nn.Conv2d(128, 32, 3, padding=1) # 跳跃连接# 编码路径# 解码路径(带跳跃连接)

FJN110的博客 108

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

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

张念磊的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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、付费专栏及课程。

余额充值