发布时间:2026/7/24 0:03:10
JPA 返回的接口 数据怎么样装到对象里边 在 JPA 中将查询结果映射到自定义对象VO/DTO主要有以下几种方式。结合你项目中的实际情况同时使用了 JPA 和 MyBatis-Plus我按推荐度从高到低列出一、接口投影Interface Projection—— 你最熟悉的方式这是你已经在用的方式适合只读查询。javapublic interface DrivingRecordVO { String getVin(); Date getTime(); String getField(); }Repository 中直接返回javaQuery(value SELECT vin, time, field FROM driving_record, nativeQuery true) ListDrivingRecordVO findRecords();优点零配置JPA 自动映射。缺点只能读不能写需要 getter 命名与 SQL 列名匹配。二、类投影Class-based DTO Projection使用普通 POJO 类带构造方法或 setter更灵活。方式一使用构造方法推荐javaData AllArgsConstructor public class DrivingRecordDTO { private String vin; private Date time; private String field; }RepositoryjavaQuery(SELECT new com.seazon.cloud.pojo.vo.DrivingRecordDTO(a.vin, a.time, b.field) FROM DrivingRecord a LEFT JOIN BEntity b ON a.vin b.vin) ListDrivingRecordDTO findRecords();注意必须用JPQL不是原生 SQL且 DTO 必须有对应的全参构造方法。方式二使用 setter 映射原生 SQLjavaData public class DrivingRecordDTO { private String vin; private Date time; private String field; // 有默认无参构造即可JPA 通过 setter 赋值 }RepositoryjavaQuery(value SELECT vin, time, field FROM driving_record, nativeQuery true) ListDrivingRecordDTO findRecords();要求DTO 有无参构造 setter 方法且 setter 名称与列名对应。三、使用SqlResultSetMappingNamedNativeQuery这是 JPA 规范的原生方式适合复杂映射。实体类上定义javaEntity NamedNativeQuery( name DrivingRecord.findRecords, query SELECT vin, time, field FROM driving_record, resultSetMapping DrivingRecordDTOMapping ) SqlResultSetMapping( name DrivingRecordDTOMapping, classes ConstructorResult( targetClass DrivingRecordDTO.class, columns { ColumnResult(name vin, type String.class), ColumnResult(name time, type Date.class), ColumnResult(name field, type String.class) } ) ) public class DrivingRecord { // ... }Repository 通过Query的name引用javaQuery(name DrivingRecord.findRecords, nativeQuery true) ListDrivingRecordDTO findRecords();四、使用Tuple手动转换适合需要动态处理结果的场景。javaQuery(value SELECT vin, time, field FROM driving_record, nativeQuery true) ListTuple findRecordsAsTuple();Service 中手动转换javaListDrivingRecordDTO result tuples.stream() .map(t - new DrivingRecordDTO( t.get(vin, String.class), t.get(time, Date.class), t.get(field, String.class) )) .collect(Collectors.toList());五、使用 MyBatis-Plus你已引入强烈推荐既然你的项目中同时有 JPA 和 MyBatis-Plus复杂查询尤其涉及窗口函数、多表关联直接用 MyBatis-Plus 最方便。javaMapper public interface DrivingRecordMapper extends BaseMapperDrivingRecord { Select(SELECT vin, time, field FROM driving_record) ListDrivingRecordDTO findRecords(); }MyBatis-Plus 会自动将查询结果的列名映射到 DTO 的字段通过 setter 或构造方法。六、总结对比方式适用场景优缺点接口投影简单只读查询最简单但扩展性差类投影JPQL 构造JPQL 查询类型安全支持复杂构造类投影原生 SQL setter原生 SQL灵活但需要注意命名匹配SqlResultSetMapping复杂映射、多表关联最标准但配置繁琐Tuple 手动转换动态字段最灵活但代码冗长MyBatis-Plus复杂查询、原生 SQL最简单与你项目契合度高七、根据你场景的推荐你的场景推荐方式简单查询1-2 张表接口投影方式一JPQL 查询类投影 构造方法方式二复杂 SQL窗口函数、多表关联MyBatis-Plus方式五需要动态字段返回Tuple 手动转换方式四最省事的选择既然你的项目已经引入了 MyBatis-Plus建议将涉及复杂 SQL 的查询全部交由 MyBatis-Plus 处理直接返回你定义的 VO/DTO 对象。这样 JPA 只负责简单的 CRUD两种框架各司其职互不干扰。

相关新闻

2026/7/24 0:03:10

java 两个 long id 怎么合并成一个long id 并且不重复

“把两个 Long ID 合并成一个唯一的 Long ID,且保证不重复”这个需求,在 Java 里直接做数学上的“完美合并”是不可能的。因为两个 Long(各 64 位)要合并成一个 Long(64 位),在信息论上是有损压…

2026/7/24 0:03:10

jdk8 把list 扁平化成String 多个以逗号分隔

在 JDK 8 中&#xff0c;将 List 扁平化为以逗号分隔的 String&#xff0c;有几种非常简洁且高效的方法。&#x1f680; 推荐方案&#xff1a;使用 Collectors.joining()这是最标准的 Java 8 写法&#xff0c;适用于 List<String>。javaimport java.util.stream.Collecto…

2026/7/24 0:03:10

不同品牌斜齿行星减速机如何替换?以PX与PAG系列为例

不同品牌斜齿行星减速机如何替换&#xff1f;以 PX 与 PAG 系列为例 一、系列对应不等于型号直接互换 PX 与 PAG 都属于斜齿、方法兰、输出轴式精密行星减速机&#xff0c;结构形式和应用方向具有对应关系。 原设备使用PX系列时&#xff0c;可以优先从PAG系列中寻找替换型号。但…

2026/7/24 1:28:15

Vue3+Python人脸识别会员管理系统开发实践

1. 项目概述&#xff1a;游泳馆会员管理系统的智能化升级去年夏天&#xff0c;我接手了本地一家游泳馆的数字化改造项目。老板王姐抱怨说&#xff0c;传统的手工登记方式不仅效率低下&#xff0c;还经常出现冒用会员卡的情况。经过两周的实地调研和技术选型&#xff0c;我们最终…

2026/7/24 1:28:15

【回眸】搞钱灵感——个人原创影像复利资产项目落地指南

很多摄影师在按下快门的那一刻&#xff0c;想的往往是这张照片能不能获奖、能不能发朋友圈获得点赞&#xff0c;却很少意识到这其实是一次资产的形成过程。在传统的影像变现逻辑里&#xff0c;我们习惯于“一锤子买卖”&#xff1a;拍一次活动收一次费&#xff0c;卖一张图拿一…

2026/7/24 1:28:15

AI Agent开发:核心框架、技术选型与工程实践

1. AI Agent开发的核心认知框架在智能体技术快速发展的当下&#xff0c;构建一个完整的AI Agent开发知识体系已成为从业者的必备技能。不同于传统的软件开发&#xff0c;AI Agent系统需要融合认知科学、行为建模和机器学习等多学科知识。我从实际项目经验中总结出三个关键维度&…

2026/7/24 1:28:15

虾皮之家是什么?Shopee卖家必备的数据分析工具全解析

每次跟刚入行Shopee的卖家聊到数据分析工具&#xff0c;他们都会问&#xff1a;"这款插件是什么&#xff1f;是不是一个独立软件&#xff1f;"说实话&#xff0c;这个问题问得特别好——因为这款插件的产品形态很特殊&#xff0c;它既不是软件也不是网站&#xff0c;…

2026/7/24 1:28:15

虾皮之家相关的工具有哪些?五大类Shopee数据分析工具全盘点

很多Shopee卖家在这款插件关闭之后&#xff0c;第一反应是"赶紧找替代品"&#xff0c;但打开百度一搜&#xff0c;发现数据分析工具五花八门——有免费的、有付费的、有插件的、有网页端的、有做选品的、有做广告的。如果你需要一个能替代这款插件全局分析能力、同时…

2026/7/24 1:23:15

最长运行两小时的网络调查 Agent,怎样避免在恶意页面里跑偏

工程上的答案&#xff1a; 长时间调查 Agent 不能只靠更大的上下文窗口。先定义证据、图谱、时间线和停止条件&#xff0c;再把状态写入可恢复文件系统&#xff1b;固定动作由 harness 强制&#xff0c;未知页面和工具故障才留给模型判断。质量 eval 与安全 eval 还要分开通过。…

2026/7/23 12:54:51

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述&#xff1a;为什么我们需要一个本地通信服务器&#xff1f;在游戏开发、数字孪生、仿真训练等众多领域&#xff0c;Unity作为强大的实时3D内容创作平台&#xff0c;其核心逻辑通常由C#驱动。然而&#xff0c;当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/24 0:03:10

不同品牌斜齿行星减速机如何替换?以PX与PAG系列为例

不同品牌斜齿行星减速机如何替换&#xff1f;以 PX 与 PAG 系列为例 一、系列对应不等于型号直接互换 PX 与 PAG 都属于斜齿、方法兰、输出轴式精密行星减速机&#xff0c;结构形式和应用方向具有对应关系。 原设备使用PX系列时&#xff0c;可以优先从PAG系列中寻找替换型号。但…

2026/7/24 0:03:10

jdk8 把list 扁平化成String 多个以逗号分隔

在 JDK 8 中&#xff0c;将 List 扁平化为以逗号分隔的 String&#xff0c;有几种非常简洁且高效的方法。&#x1f680; 推荐方案&#xff1a;使用 Collectors.joining()这是最标准的 Java 8 写法&#xff0c;适用于 List<String>。javaimport java.util.stream.Collecto…

2026/7/24 0:03:10

java 两个 long id 怎么合并成一个long id 并且不重复

“把两个 Long ID 合并成一个唯一的 Long ID&#xff0c;且保证不重复”这个需求&#xff0c;在 Java 里直接做数学上的“完美合并”是不可能的。因为两个 Long&#xff08;各 64 位&#xff09;要合并成一个 Long&#xff08;64 位&#xff09;&#xff0c;在信息论上是有损压…

2026/7/23 23:42:43

3个高效策略:快速掌握Axure中文界面配置

3个高效策略&#xff1a;快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…