NHibernate.剖析:Query篇之NHibernate.Linq自定义扩展 📅 发布时间:2026/7/7 17:29:04 👁️ 浏览次数: 露阶辟较C#转java的最好利器easy-query就是efcore4j sqlsugar4j freesql4j背景随着信创或者其他一系列面向领导编程导致部分使用C#的公司转型javajava下EfCore、SqlSugar 、FreeSql的竞品或者替代品就是easy-query本章节我将介绍隐式分区分组在实际中如何使用并且带来秒杀全世界ORM的独特功能隐式Group又叫GroupJoin可以无缝合并多个相同子查询转java没有一个好用的orm怎么办我之前用sqlsugar的现在有没有sqlsugar-java我之前用efcore的现在是否有efcore-java我之前是freesql的粉丝转java后有没有freesql-java这一切的一切都随着easy-query的迭代而变得轻松数据库模型image点击查看实体代码案例查询用户信息和最早开户的银行卡信息通过模型我们可以清晰的看到SysUser和BankCard是一对多的关系eq如何实现这种一对多的数据返回呢使用临时对象返回var list easyEntityQuery.queryable(SysUser.class).select(user - {//定义最早开户的银行卡SysBankCardProxy firstBankCard user.bankCards().orderBy(bankCard - bankCard.openTime().asc()).first();return Select.DRAFT.of(user.id(),user.name(),firstBankCard.code(),firstBankCard.type(),firstBankCard.openTime(),firstBankCard.bank().name());}).toList();生成的sqlSELECT t.id AS value1, t.name AS value2, t3.code AS value3, t3.type AS value4, t3.open_time AS value5, t4.name AS value6FROM t_sys_user tLEFT JOIN (SELECT t1.id, t1.uid, t1.code, t1.type, t1.bank_id, t1.open_time, ROW_NUMBER() OVER (PARTITION BY t1.uid ORDER BY t1.open_time ASC) AS __row__FROM t_bank_card t1) t3ON t3.uid t.idAND t3.__row__ 1INNER JOIN t_bank t4 ON t4.id t3.bank_id查询用户至少有5张储蓄卡且没有信用卡的用户信息和对应的第4张储蓄卡信息分解条件要先找出用户至少有5张储蓄卡要找出用户没有信用卡要返回用户信息额外返回用户的第4张储蓄卡信息//新创建一个dto用来接收而不是使用临时对象DataEntityProxypublic class UserDTO2 {private String id;private String name;private String thirdCardType;private String thirdCardCode;private String thirdCardBankName;}List list easyEntityQuery.queryable(SysUser.class).where(user - {//用户至少有三张储蓄卡user.bankCards().where(c - c.type().eq(储蓄卡)).count().gt(4L);//用户没有信用卡user.bankCards().where(c - c.type().eq(信用卡)).none();}).select(user - {SysBankCardProxy thirdCard user.bankCards().orderBy(bankCard - bankCard.openTime().asc()).element(3);return new UserDTO2Proxy().id().set(user.id()).name().set(user.name()).thirdCardType().set(thirdCard.type()).thirdCardCode().set(thirdCard.code()).thirdCardBankName().set(thirdCard.bank().name());}).toList();最终生成的sqlSELECT t.id AS id, t.name AS name, t5.type AS third_card_type, t5.code AS third_card_code, t6.name AS third_card_bank_nameFROM t_sys_user tLEFT JOIN (SELECT t3.id, t3.uid, t3.code, t3.type, t3.bank_id, t3.open_time, ROW_NUMBER() OVER (PARTITION BY t3.uid ORDER BY t3.open_time ASC) AS __row__FROM t_bank_card t3) t5ON t5.uid t.idAND t5.__row__ 4INNER JOIN t_bank t6 ON t6.id t5.bank_idWHERE (SELECT COUNT(*)FROM t_bank_card t1WHERE t1.uid t.idAND t1.type 储蓄卡) 4AND NOT EXISTS (SELECT 1FROM t_bank_card t2WHERE t2.uid t.idAND t2.type 信用卡LIMIT 1)什么你看不懂sql没关系直接丢给ai让他帮我们看看image看来ai还是很懂sql的嘛聪明的肯定又发现了盲点你这边生成了两个子查询sql导致整体sql性能偏弱是否有好的解决方案呢隐式groupeq提供了子查询合并我们又叫他groupJoin或者隐式group那么应该怎么做呢基本上什么代码都不需要动只需要加一行配置即可List list easyEntityQuery.queryable(SysUser.class)//增加这行配置.configure(s - s.getBehavior().add(EasyBehaviorEnum.ALL_SUB_QUERY_GROUP_JOIN)).where(user - {//用户至少有三张储蓄卡user.bankCards().where(c - c.type().eq(储蓄卡)).count().gt(4L);//用户没有信用卡user.bankCards().where(c - c.type().eq(信用卡)).none();}).select(user - {SysBankCardProxy thirdCard user.bankCards().orderBy(bankCard - bankCard.openTime().asc()).element(3);return new UserDTO2Proxy().id().set(user.id()).name().set(user.name()).thirdCardType().set(thirdCard.type()).thirdCardCode().set(thirdCard.code()).thirdCardBankName().set(thirdCard.bank().name());}).toList();再来看看我们生成的sqlSELECT t.id AS id, t.name AS name, t5.type AS third_card_type, t5.code AS third_card_code, t6.name AS third_card_bank_nameFROM t_sys_user tLEFT JOIN (SELECT t1.uid AS uid, COUNT(CASEWHEN t1.type 储蓄卡 THEN 1ELSE NULLEND) AS __count2__, COUNT(CASEWHEN t1.type 信用卡 THEN 1ELSE NULLEND) 0 AS __none3__FROM t_bank_card t1GROUP BY t1.uid) t2ON t2.uid t.idLEFT JOIN (SELECT t3.id, t3.uid, t3.code, t3.type, t3.bank_id, t3.open_time, ROW_NUMBER() OVER (PARTITION BY t3.uid ORDER BY t3.open_time ASC) AS __row__FROM t_bank_card t3) t5ON t5.uid t.idAND t5.__row__ 4INNER JOIN t_bank t6 ON t6.id t5.bank_idWHERE IFNULL(t2.__count2__, 0) 4AND IFNULL(t2.__none3__, true) true好的我们再把sql交给ai重新开启一个会话看看他会怎么回答image很好ai再次证明了easy-query的准确性且easy-query再次证明了他在OLAP中秒杀所有其他ORM最后的最后我非常感谢您能看到这边我相信eq绝对是你不二的orm选择
你可能不知道的个JavaScript小技巧 驶沉难尾前言 C#/.NET/.NET Core优秀项目和框架2025年9月简报 AutoMapper 收费了,.NET 开发者速来拥抱 Mapster,现代免费的对象映射库! 精选 4 款开源免费、美观实用的 MAUI UI 组件库,助力轻松构建美观且功能丰富的应用程序&a… 2026/7/4 8:37:52
讨论:WCF可序列化的ActiveRecord实现有意义吗? 姥侥掷赣前两天聊了下Roslyn,如果您耐心看完,也算是入了门,那么今天继续分享它的另外一大特性,那就是 Source Generator,(源代码生成器)是 (Roslyn)提供的一项强大功能&a… 2026/5/17 7:45:58
Silverlight MMORPG网页游戏开发课程[一期] 第三课:封装游戏控件 捕及低追什么是Character?什么是Glyph?Character和Glyph是否一一对应?我们常说的Font又包含哪些东西?如果要自己实现一套文本的分词、测量和布局,又需要理清楚哪些概念?ascent、descent、lineHeight之间的关… 2026/7/5 2:14:16
企业数据频频泄露?教你几招准确保护数据安全 在数字化浪潮席卷全球的今天,数据已成为企业最核心的资产。然而,随着网络攻击手段的日益复杂以及各类合规法规的相继实施,数据泄露事件频发,给企业带来了巨大的经济损失与声誉风险。因此,如何保护数据安全,… 2026/7/7 17:26:08
HLW8112芯片软件实现代码(1) 一、HLW8112芯片简介1. 概述HLW8112是合力为科技推出的一款高精度的电能计量IC,它采用CMOS制造工艺,主要用于单相应用。它能够测量线电压和电流,并能计算有功功率,视在功率和功率因素。HLW8112内部集成了三个∑-Δ型ADC和一个高精… 2026/7/7 17:24:08
《章鱼智赋 AI:连锁 GEO 服务商权威推荐》 2026年的中国连锁加盟行业,正处在从“规模扩张”向“效率红利”转型的关键时刻。同质化竞争、流量成本飙升、加盟商对“快招”模式失去信心……这一切都迫使连锁品牌必须寻找新的增长引擎。而在这场变革中,一种全新的营销与运营策略脱颖而出,… 2026/7/7 17:20:07
10 JDBC JDBC、连接池、反射与注解第一章.JDBC 基础1.1 JDBC 的介绍1.JDBC:Java Database Connectivity,Java 数据库连接。2.作用:Java 提供的一套操作关系型数据库的标准 API。3.特点:Java 定义接口和规范。数据库厂商提供具体驱动实现。Java 程序↓ JDBC API MySQL 驱动 mysql-connec… 2026/7/7 17:18:07
13 硬件工程师笔面试高频考点真题解析——DC-DC和LDO 目录 1.13 DC-DC和LDO 1.13.1 简述DC-DC和LDO的区别 1.13.2 简述LDO的主要优缺点 1.13.3 LDO的核心参数有哪些? 1.13.4 简述LDO的工作原理 1.13.5 简述LDO输出电容COUT的作用 1.13.6 简述DC-DC的优缺点 1.13.7 简述PWM(脉冲宽度调制)和PFM(脉冲频率调制) 1.13.8 DC-D… 2026/7/7 17:16:06
探索3大核心功能:轻松提取碧蓝航线Live2D模型的完整指南 探索3大核心功能:轻松提取碧蓝航线Live2D模型的完整指南 【免费下载链接】AzurLaneLive2DExtract OBSOLETE - see readme / 碧蓝航线Live2D提取 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneLive2DExtract AzurLaneLive2DExtract是一款专为《碧蓝航… 2026/7/7 17:14:05
Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践 1. 项目概述:Acunetix v24.8 高级版漏洞扫描器深度解析作为一名在网络安全领域摸爬滚打多年的老兵,我深知一款趁手的“兵器”对于安全测试工作意味着什么。今天要聊的,就是Web应用安全测试领域里一个响当当的名字——Acunetix。特别是其v24.8… 2026/7/7 0:01:11
如何3步搞定加密视频下载:跨平台资源嗅探与解密工具终极指南 如何3步搞定加密视频下载:跨平台资源嗅探与解密工具终极指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是… 2026/7/7 0:03:13
Jailhouse-gui可视化管理工具:让多核处理器分区变得简单高效 Jailhouse-gui可视化管理工具:让多核处理器分区变得简单高效 【免费下载链接】Jailhouse-gui A graphical user interface (GUI) tool for configuring and managing Jailhouse, a Linux-based hypervisor for partitioning multicore processors into isolated cel… 2026/7/7 0:03:13
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/7 11:26:57
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/7 11:26:58