译文: Hibernate 查询结果映射 Result Set Mapping 处理

62. 如何通过增强(Enhancement) 的方式给 SAP ABAP 标准程序增添新功能 本文通过一个实际的例子,介绍了如何不通过修改 SAP 标准 ABAP 程序源代码的方式,对其的功能进行增强,即采取 ABAP 增强开发的方式进行二次开发,这是一种在实际 SAP 项目实施过程中使用非常广泛的技术。 阅读详情

这是我的系列中第四篇也是最后一篇关于 SQL 结果映射设置:


* Result Set Mapping: 基础映射
* Result Set Mapping: 复杂映射
* Result Set Mapping: 构造结果映射器
* Result Set Mapping: Hibernate 映射特性


在第一篇中,我们看到一些简单的映射定义把查询结果映射到一个实体中. 映射定义在第二篇中增加了复杂度,由于我们映射了查询结果到多个实体类并处理了额外的字段. 然后在第三篇中,我们看到了JPA 2.1 的新特征之一,构造结果映射。


这一次我们来看一些 Hibernate 具体映射特征,它们不属于 JPA 的标准规范. Hibernate 提供了它自己的 API 来映射查询结果. 当使用了后会和 Hibernate 绑定紧密意味着迁移到另一个平台会很困难,此特性同样提供了一些有趣的特性. 像往常一样,你需要决定并权衡你使用后所面临之后的问题。
IMAGE

示例

我们开始之前,让我们看下示例中我们将会使用的实体模型. 如果你读了这个系列的第二部分, 你应该已经比较熟悉 Author 与 Book 实体类. 这两个实体类很简单. Author实体类有id,version,first name,与last name. Book实体类有id,version,title与关联到Author. 为了避免不必要的复杂性,每本Book只能被一个Author编写。
IMAGE
我使用 Wildfly 8.2 与 Hibernate 4.3.7 来进行测试示例. 再次重申:根据我们在此文中所使用的特性属于 Hibernate 的特性而不是 JPA 标准,你不能在其他 JPA2.1 实现框架中使用。
你可以从这里获取源码信息:我的 github 账户。

如何使用 Hibernate 此特性

在这个系列之前的篇章中,我们使用 JPA 标准特性并使用 EntityManager 来执行 SQL 语句. 这一次我们使用 Hibernate 特性,所以我们需要使用 Hibernate Session 实例来进行操作. 在一个 Java EE 环境中,Session 实例可以采用 EntityManager.getDelegate() 方法来获取,如下面代码片段:

@PersistenceContext
private EntityManager em;

...

public void queryWithAuthorBookCountHibernateMapping() {
  Session session = (Session)this.em.getDelegate();
  ...
}

别名让映射更简单

Hibernate 提供了一组与 JPA 标准类似的 API 接口. 但在前面章节中使用 Hibernate API 有时能够更加方便来实现我们创建结果映射. 下面一个代码片段就是一个例子,从数据库查询的哪些所有的 Books 与 Authors 映射到对应的实体类中. 在真实项目环境中, 也许你不会直接使用 SQL 查询来做一个简单的 select. 但这个可以足够说明了结果映射了. 为了让你更方便查看,我去掉了非常复杂的真实项目中的查询。

List<Object[]> results = ((Session)this.em.getDelegate()).createSQLQuery("SELECT {b.*}, {a.*} FROM Book b JOIN Author a ON b.author_id = a.id").addEntity("b", Book.class).addEntity("a", Author.class).list();
results.stream().forEach((record) -> {
    Book book = (Book) record[0];
    Author author = (Author) record[1];
    System.out.println("Author: ID [" + author.getId() + "] firstName [" + author.getFirstName() + "] lastName [" + author.getLastName() + "]");
    System.out.println("Book: ID [" + book.getId() + "] title[" + book.getTitle() + "]");
});

查询语法在开始时可能看起来比较奇怪, 但它提供了一个非常简单的方式来处理所有实体字段. 而不是在查询语句中一个一个的指定字段进行映射,根据我们在此系列章节第二部分,我们现在使用了 {a.} 与 {b.} 来选择他们. 映射别名 a 与 b 到实体类可以通过调用 addEntity(String tableAlias, Class entityType) 来完成.


下列代码片段显示了一个相似的结果映射. 这一次, 我们选择了一个 Author 实体 并与他/她的数量来作为新统计字段. 我们在系列第二部分使用了相同的查询方式, 主要采用其 JPA 标准的 @SqlResultSetMapping 注解方式进行映射,有兴趣可以点进去查看。

List<Object[]> results = ((Session)this.em.getDelegate()).createSQLQuery("SELECT {a.*}, count(b.id) as bookCount FROM Book b JOIN Author a ON b.author_id = a.id GROUP BY a.id, a.firstName, a.lastName, a.version").addEntity(Author.class).addScalar("bookCount", StandardBasicTypes.LONG).list();
results.stream().forEach((record) -> {
    Author author = (Author) record[0];
    Long bookCount = (Long) record[1];
    System.out.println("Author: ID [" + author.getId() + "] firstName [" + author.getFirstName() + "] lastName [" + author.getLastName() + "] number of books [" + bookCount + "]");
});

到现在为止, 我们创建了两条结果映射示例,当然,这两条示例也可以进行 JPA 相应处理完成. 从我们观点来看, 在一条查询中如果映射结果比较具体化则Hibernate API 更为简单一些, 但如果没有其他理由来依赖使用 Hibernate 我依然会使用 JPA. JPA的注解或XML配置结果映射标准可以被用来映射多查询结果。

更灵活的映射方式 ResultTransformer

另一个更强大的方式是 ResultTransformer 可以更灵活转换查询结果,它提供了我们可以在 Java 代码中进行结果映射. 现在也许你会说这就是我开始就想避免的情况,确实你是对的. 但是你可以看 JavaDoc, Hibernate 提供了大量不同的此接口的实现. 那么在大多数情况下, 我们没有必要自己来实现映射实现, 否则 ResultTransformer 大只可以提供最简单的使用方式. 其中一个好用的实现类就是 AliasToBeanResultTransformer, 它会把结果映射到一个 Java Bean. 但除了使用构造器调用外, 根据我们在 第三方结果映射 中, 转换器使用setter方法或属性来进行填充对象. 这个有好处的, 如果类存在大量的属性我们需要创建一个或多个带参构造器, 因为多查询结果需要被映射到同一个类. 下列代码展示了 AliasToBeanResultTransformer 的使用。

List<BookValue> results = ((Session)this.em.getDelegate()).createSQLQuery("SELECT b.id, b.title, b.version, a.firstName || ' ' || a.lastName as authorName FROM Book b JOIN Author a ON b.author_id = a.id")
    .addScalar("id", StandardBasicTypes.LONG).addScalar("title").addScalar("version", StandardBasicTypes.LONG).addScalar("authorName")
    .setResultTransformer(new AliasToBeanResultTransformer(BookValue.class)).list();

results.stream().forEach((book) -> {
    System.out.println("Book: ID [" + book.getId() + "] title [" + book.getTitle() + "] authorName [" + book.getAuthorName() + "]");
});

AliasToBeanResultTransformer 使用了 BookValue 默认的构造器来进行初始化与搜索基于别名与返回字段类型的 getter 方法。因此,我们需要使用 addScalar() 方法来重命名字段并改变 id、version 字段的类型.

结论

这个是此系列的最后一篇, 看过上面篇章中参照 JPA 标准定义不同的方式进行实现结果映射, 我们现在看过 Hibernate 具体的特性的实现. Hibernate 提供了 API 来支持别名映射查询结果到 Java 实体类或值对象. 除简单使用之外, 也提供了一些优点, 所有信息都放在相同的位置. 不需要再根据注解或XML文件进行映射定义. 另一方面, 如果不这样我们就需要花更多的工作在映射定义上面,这样也不像使用 JPA 标准那样简单。


对于 ResultTransformer 从另一个角度说,对比标准映射它提供了一些真正的灵活方式. 这些可以用来实现更复杂的映射并且 Hibernate 已经实现了一组 ResultTransformer 的实现类. 如果它们都无法实现咱们想要的需求,我们可以利用此特性来自定义我们自己的. 但基于这个例子, 我更倾向在我业务代码中使用 Streams API 来进行映射查询结果。

SEO

Result Set Mapping: Hibernate Specific Mappings
SQL result set mappings

原文出处

https://www.thoughts-on-java.org/result-set-mapping-hibernate-specific-mappings/

【云原生技术】云计算与网络:容器服务(Tencent Kubernetes Engine,简称TKE)简介 基本概念主要特点应用场景技术实现容器服务(Tencent Kubernetes Engine,简称TKE)是腾讯云提供的一种托管的容器管理服务,基于开源的Kubernetes系统。TKE旨在简化容器的部署、管理和扩展,并且提供高性能、可靠性和安全性,适用于各种规模的企业和应用。 阅读详情

相关推荐

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

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

weixin_28314575的博客 507

【JPA】JPA本地查询注解SqlResultSetMapping的使用

配置最后的形式: @SqlResultSetMapping ( name = "ItemResults", entities = { @EntityResult( entityClass = Item.class, //就是当前这个类的名字 fields = {

zwan0518的专栏 2万+

stm32 + freertos + c++混合编程方法

其他一些资料上面,c++配置成--cpp11或者-cpp 都是把工程配置成c++。三、添加cpp文件,我们调用cpp文件里面的接口函数,不需要修改main.c后缀名。2、配置工程编译时候是--c99,是因为工程里面FreeRTOS是c语言,c++模式会报错。我们这里是默认c,编写的c++文件,单独选择--cpp编译,这在后面配置!c++是面向对象编程,对于一些项目来说,c++编程更加合适!stm32cubemax配置,这里就不写了,配置资料比较多。这里就是让cpp文件在c++下编译。最后,编程成功,点亮!

yuhu0012的博客 2629

关于使用@NameNativeQuery和@SqlResultSetMapping自定义复杂查询

@NameNativeQuery

只为成功找方法 不为失败找借口 1097

红外通信不止遥控器:手把手教你用2ASK调制实现语音+温度数据同传

本文详细介绍了如何利用2ASK调制技术实现红外通信系统,同时传输语音和温度数据。通过STM32F103C8T6微控制器和DS18B20温度传感器的硬件设计,结合2ASK调制原理,展示了系统的完整实现方案。文章还提供了调试优化建议,适合电子爱好者和通信工程学生实践学习。

weixin_42531588的博客 389

宏基因组功能注释实战:从CAZyme到VFDB的完整流程(含数据库下载与脚本优化)

本文详细介绍了宏基因组功能注释的完整流程,涵盖CAZyme、eggNOG、CARD和VFDB四大核心数据库的实战应用。从环境配置、数据库下载与预处理到注释流程执行与优化,提供了全面的操作指南和脚本优化建议,帮助研究人员高效完成宏基因组数据分析。特别针对CAZyme注释等关键步骤给出了参数优化方案和常见问题排查方法。

weixin_29289821的博客 296

hibernate查询结果映射到实体和map的方法

1.sql查询封装对象,配置映射,把查询出来的数据封装到实体当中: 方法一:addEntity(A.class)设定查询出的结果映射到相应的实体中,但是这个实体必须在hibernate的映射文件中配置了相应的映射 public List<MyEvent> getMyEvents() { String sql = "select p.*,e.* from person_inf as

menghuanzhiming的博客 1万+

运维颠覆!一文解锁AI赋能运维实战秘籍,效率飙升!

将AI应用于运维工作是一场极具价值的变革,从故障预测与诊断到自动化任务执行,再到资源管理优化,AI都展现出巨大潜力。尽管在实践过程中会面临数据质量、模型复杂性等挑战,但通过合理的技术选型和解决方案,我们能够充分挖掘AI的优势,实现运维工作的高效、智能转型。持续探索和创新AI在运维领域的应用,将为企业的数字化发展提供坚实保障。在科技飞速发展的当下,运维领域正经历着深刻变革,AI的融入成为提升运维效率与质量的关键。本文将深入实战,带你领略AI如何在运维各环节大显身手,让你的运维工作开启智能高效新模式。

探索云原生与智能化驱动下的安全运维新范式。关注DevSecOps、可观测性、AIOps等前沿领域,与您共赴技术前沿。 401

JPA SQL 查询、结果集映射(@NamedNativeQuery、@ColumnResult注解说明)

JPA支持两种方式:JPQL和条件API,条件API不推荐看。Java持久化查询语言JPQL,了解下JPQL 是 实体模型上进行查询的,而且查询的结果只能是实体对象或者实体的一个字段,查询的是实体对象。JPQL后面都会去转化为本地的sql执行。。。1. 查询实体的所有数据 /单个字段        select e from Employee e         select e.name fro...

z1340954953 2万+

基于C#通过PLCSIM ADV仿真软件实现与西门子1500PLC的S7通信方法演示

基于C#通过PLCSIM ADV仿真软件实现与西门子1500PLC的S7通信方法演示

Robot_PLC_HMI_Automation 3161

《MATLAB项目实战》,专栏目录和介绍

MATLAB 是一款强大且广泛应用的数值计算和数据可视化软件工具,它提供了一个高效、简洁的编程环境,使用户能够进行从简单的矩阵运算到复杂的多维数据分析的各种计算任务。无论是在人工智能、计算机视觉、图像处理还是其他领域,MATLAB 都能够提供精准、快速的解决方案,因此成为了全球科研人员、工程师以及数据分析师的得力工具。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 6478

工作中使用到的单词(软件开发)

1.エイリアス   alias 别名 powershell使用 get-help 命令时,会得到与此命令 相关(别名)的命令 2.プロキシ proxy 代 理 3.プロモート   promote 促进,提升   开发的系统新功能上线发布,有时会使用到这个词,比如 STプロモート 还有使用リリース这个词的。比如STリリース。个人认为两者含义相同。 4.見逃し み................................................................

sun0322 6万+

锂电池SOH估计 | 锂电池SOH基础计算与可视化(Python)

锂电池SOH估计 | 锂电池SOH基础计算与可视化(Python)

前程算法屋的博客 900

java jpa set_java – Spring JPA,@ SqlResultSetMapping映射到JPA存储库

应用:弹簧启动我试图使用@SqlResultSetMapping将非实体类映射到JPA存储库和@NamedNativeQuery.我在运行应用程序时遇到以下错误:Unsatisfied dependency expressed through field ‘cityAddressRepository’; nested exception is org.springframework.beans.f...

weixin_34294809的博客 808

IDEA的使用指南

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

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Spring Data Jpa框架:自定义SQL查询时,返回自定义DTO的四种方式

如果想返回我们自己的自定义对象,可以使用如下四种方式

gu_zhang_w的博客 3247

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Jpa批注参考07

详细解释了下面9个批注的含义及其批注所包含的属性:@SequenceGenerator@SqlResultSetMapping@SqlResultSetMappings@Table@TableGenerator@Temporal@Transient@UniqueConstraint@Version■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■  @Sequ

wxy的专栏 694

后台返回数据 页面format日期_JPA 使用NamedNativeQuery+SqlResultSetMapping对返回数据封装...

Springboot 使用NamedNativeQueries+SqlResultSetMapping对返回数据封装​www.bestjimmy.com业务上经常有一种场景:对多个表(实体)查询进行sql查询,然后返回都是相同格式的数据。比如对多个表数据按日期进行统计,返回不同表每天的数据更新/创建个数。返回结果涉及多个字段,如果是单个字段,JPA在Repository类中定义@Query可以直接...

weixin_39786155的博客 383

# 光速上手 - JPA 原生 sql DTO 投影

文章所述已经过实际开发测试,保证有效!倾力创作分享干货知识!帮助你花更少时间,获得最多知识!

2403_89128801的博客 1873

Java for Web学习笔记(一二三):搜索(5)MySQL全文索引(下)

小例子我们在表格Ticket和TicketComment中加入了fulltext key。小例子在Ticket的Subject或Body,以及在TicketComment的Body检索内容,按分页方式显示出来,同时显示关联分数,并按关联分数降序排列。 -- Ticket中队Subject和Body这两列进行全文检索 FULLTEXT KEY `Ticket_Search` (`Subject`,...

愷风(Wei)的专栏 1034

原生SQL在@Query中的妙用,大幅提升查询效率的7种姿势

掌握JPA多表查询性能瓶颈?本文详解@Query中使用原生SQL的7种高效姿势,涵盖复杂关联、分页优化等场景,提升查询效率。通过精准SQL控制,解决JPQL局限,值得收藏。

ProceShoal的博客 1126

【JPA】关于JPA使用原生多表查询,返回实体集合的方法 [@FiledResult]注解应用

执行 @NamedNativeQuery 时,它可以返回实体(包括不同类型的实体)、标量值或实体和标量值的组合。 默认情况下,JPA 持续性提供程序假设在使用 @EntityResult 返回实体时,SELECT 语句将包含与返回的实体的所有字段或 属性相对应的所有列,且SELECT 语句中的列名对应于字段或属性名(未使用AS 语句)。 如果 SELECT 语句只包含某些与返回的实体的字段或

JobsIphoneVip的专栏 5737

Spring data JPA常见问题汇总

JPA 部分查询问题解决

曲折旅程,艰难人生 4105

Spring,Hibernate,ResultSet和事务

今天研究了一天的关于Spring,Hibernate,ResultSet和事务, 最后发现只有直接返回结果集的地方,事务管起来都是麻烦不断。 所以任何时候直接返回结果集都是一个坏主意。 如果想利用Hibernate直接执行Sql进行带事务的更新/删除操作,可以用下面的方法,当然方法在使用的过程中,需要根据自己的实际情况稍作改动。 [code="java"]public int executeU...

来杯咖啡,随便聊聊。 247

Hibernate学习之---SQL查询

SQL查询是通过SQLQuery接口来表示的。SQLQuery接口是Query接口的子接口,因此完全可以调用Query接口的方法。执行SQL查询的步骤是: 获取Hibernate Session对象。 编写SQL语句。 以SQL语句作为参数,调用Session的createSQLQuery()方法创建查询对象。 调用SQLQuery对象的addScalar()或addEntity()方法将选出的结果

StrongHYQ的博客 1108

[笔记] JPA使用小结

目录 JPA查询方式 JPA传入参数null和""区别 JPA Specification 关联查询 使用函数查询 使用like JPA createNativeQuery JPA SqlResultSetMapping Java Plain JDBC数据库操作实例 多数据源实体到数据库命名自动映射失效配置 多数据源@PersistenceContext VS@Autowired 多数据源开启指定事务 JPA 使用AbstractBaseEntity并设置修改时间修改人等自动填充.

LeoSong121的博客 1791

resultMap的高级结果映射和动态sql

resultMap的高级结果映射和动态sql

温涛的博客 1523
上一篇: 如何使用 Spring MVC 进行单文件与多文件上传的三种情况
下一篇: 利用 Google Guava 提供的便捷方法对 List 进行内存分页
littlebrain4solving
博客等级 码龄12年 252粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值