Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Hibernate正在两次选择相同的列。为什么和目的是什么?

Hibernate正在两次选择相同的列。为什么和目的是什么?
EN

Stack Overflow用户
提问于 2022-02-20 18:42:13
回答 2查看 744关注 0票数 1

在下面的Hibernate生成的查询中,student_idcollege_id_fk字段被选中了两次,为什么是这样,目的是什么?这能修好吗。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2022-02-21 07:12:33.213 TRACE 19824 --- [           main] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([student_1_12_0_] : [INTEGER]) - [6]
Hibernate: 
    select
        students0_.college_id_fk as college_3_12_0_,
        students0_.student_id as student_1_12_0_,
        students0_.student_id as student_1_12_1_,
        students0_.college_id_fk as college_3_12_1_,
        students0_.student_name as student_2_12_1_ 
    from
        student students0_ 
    where
        students0_.college_id_fk=?
2022-02-21 07:12:33.214 TRACE 19824 --- [           main] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [INTEGER] - [1]

呼叫代码如下-

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  collegeRepo.findAll().forEach( c -> System.err.println("college wit students: " + c.getStudents() ) );

以上是spring数据jpa提供的方法,因此它具有从spring数据jpa实现的功能。

我也经历过类似的问题,这表明实体可能有一些错误,比如映射错误或@Id使用错误。所以,我把我的实体关系贴在这里。

实体关系是-学生属于一所大学,一所大学可以有多个学生。学生

这些实体如下。

(小编辑1-遵循肯的建议,我已经评论了College.students实体的急切加载,但“选择两次”问题仍然存在。)编辑1的结尾)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Entity
public class College {

    @Id
    @GeneratedValue
    private int collegeId;

    private String collegeName;

    @OneToMany(targetEntity = Student.class, mappedBy = "college") //, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    //as you can see students is loaded eagerly.
    private List<Student> students;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Entity
public class Student {

    @Id
    @GeneratedValue
    private int studentId;

    private String studentName;

    @ManyToOne
    @JoinColumn(name = "collegeId_fk")
    private College college;

我在搜索引擎上搜索"Hibernate两次选择同一列“。但是没有什么有用的结果。因此,SOF是理解或解决此问题的唯一方法。

应@tgdavies的请求: spring启动版本为2.6.1,hibernate-core版本为5.6.1

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-22 00:40:19

版本6.0之前的Hibernate依赖于为每一列使用而生成的别名。因此,如果您有多个关联,甚至只是一个与许多关联相反的关联,您将看到重复的列选择,因为在6.0之前的Hibernate基于别名获取值。Hibernate 6.0切换到基于位置的抓取和反重复选择为同一列.

票数 2
EN

Stack Overflow用户

发布于 2022-02-20 20:01:00

您提到的select SQL是由大学学生的急切加载触发的。我简要地跟踪了源代码,并将其归结为OneToManyPersister,以便在这里生成select子句。我不知道为什么作者会生成select子句,其中包含一些重复的列,而且我认为除非您使用自己修补的hibernate版本,否则您无法改变这种行为。

如果你真的不希望这种情况发生,我的建议是不要对这所大学的学生使用急切的抓取。毕竟,这是个坏主意,因为急切的抓取会带来N+1查询问题。如果你有100所大学,这样的SQL会重复100次来加载这100所大学的学生。

为了避免N+1查询问题和SQL中的重复列,您可以编写一个JPQL查询,以便将该学院与其学生一起获取连接:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Query("select distinct c from College c left join fetch c.students")
List<College> findAllCollegeWithStudents();

或者,如果您愿意的话,可以使用@EntityGraph声明性地执行此操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@EntityGraph(value = "students")
List<College> findAll(); 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71200665

复制
相关文章
源目的IP和端口都相同的连接出现的原因
线上遇到了一个比较特殊的连接,它的源目的IP和端口完全相同,复现的场景是:同一个机器上的两个模块A和B通信,A模块会向B模块的监听套接字发起连接请求,B模块重启的时候就很容易出现这样的问题。下图是在线
李海彬
2018/03/22
2.6K0
源目的IP和端口都相同的连接出现的原因
用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
数据库中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
全栈程序员站长
2022/07/09
1.7K0
imazing是什么?为什么选择 iMazing?
说起iOS设备管理工具,可能大家还有点陌生,其实就是Apple公司开发的移动设备,因其的操作系统是独特的iOS系统,所以又叫iOS设备。比如大家都在用的iPhone手机,就是这样类型的一个设备。
用户9208731
2023/03/30
1K0
imazing是什么?为什么选择 iMazing?
根据某列相同元素求和
下面是一个需要计算相同基因的exon的长度的文件,即根据相同的基因,先计算基因的起点到终点的距离,再对相同的基因的的exon距离求和
生信编程日常
2020/06/11
9960
根据某列相同元素求和
使用EXCLE表格,有相同列,取某一列的值
如图,我有两列MAC地址表,然后需要把F列的值取值到D列,可以使用公式:=VLOOKUP(A1,$E$1:$F$44,2,0)进行处理数据。A1代表以哪一列为基础取值参考,$E$1:$F$44代表查找对比范围。
Tacc
2022/01/11
4.3K0
使用EXCLE表格,有相同列,取某一列的值
激光淬火预处理目的和工艺选择
由于激光淬火工艺具有热影响区小、工件变形小、淬火区晶粒极其细小均匀等诸多优点,激光淬火在机械生产、制造和维修中的地位越来越高!下面我们就来说说有关激光淬火的预处理方法。
国盛激光
2023/03/15
2220
激光淬火预处理目的和工艺选择
hibernate 未明确定义列 小记[通俗易懂]
在写关联表的实体类时,用测试代码去运行,出现 16:00:30,817 ERROR JDBCExceptionReporter:72 – ORA-00918: 未明确定义列
全栈程序员站长
2022/09/27
3400
hibernate 未明确定义列 小记[通俗易懂]
数据分析的目的和意义(作用)是什么?
很多人会问数据分析目的是什么?它有什么作用?让我们看看亿信华辰如何看待数据分析的目的和意义。仅仅谈论数据分析的作用实际上并不重要,因此在谈论该作用之前,我们首先要考虑受众,打个比方:对于个人而言,由于身体感应设备的原因,让我们每天锻炼身体健身各种指标可以数字化,最终完成对个人身体和生活习惯的自我量化,然后完善对个人日常生活规律的调节,使我们过上更好的生活。
数据前沿
2020/06/16
3.4K0
数据分析的目的和意义(作用)是什么?
CBO如何选择相同cost的索引
根据10053显示,可以看出,IDX_Z_01和IDX_Z_02这两个索引,cost相同,CBO会选择何种执行计划?
bisal
2019/01/30
9200
sublime 列选择 原
2016年11月17日 09:27:24 zzh_my 阅读数:20295 标签: sublime text 更多
拓荒者
2019/03/08
2.6K0
Kubernetes是什么以及你为什么选择它?
Kubernetes是一个用于容器编排的开源系统,支持自动化应用程序部署,扩展以及管理。阅读这篇博客文章,从商业视角了解下Kubernetes。我将简要介绍虚拟化方法,构建Kubernetes的关键概念以及它在运行容器化应用程序时如何帮助您的业务。
kubernetes中文社区
2019/07/31
6320
为什么隧道封装是Docker多数网络项目的共同选择
在我之前 weave的运行原理 的文章中,介绍到weave在跨主机的容器通信过程中,会使用pcap截获容器发送和接收的 网络包,然后按照自定义的格式将这些包重新封装为UDP报文再次注入到bridge上的接口发送出去。实际上这不是weave独有的选择,CoreOS的 fannel网络项目也是一样的方法。最近被docker公司收购的初创项目socketplane,采用基于openvswitch的vxlan的隧道技术来实现相同的过程。那么,就有一个疑问:实际上只要使用主机port mapping或是将docker原生网桥docker0的上行链路连通网卡,容器的流量都可以从主机发送出去,为什么这么多的docker网络项目都不约而同地选择使用隧道技术将网络负载再次封装发送,接收的时候再解封装呢?
星哥玩云
2022/07/04
3740
HashMap为什么用链表加红黑树?目的是什么?原理是什么
关于hashmap的其他有关问题我在源码研究专栏中都有讲解,深入到源码层次的讲解,绝对一看就懂 链接: 深入源码,探究设计思想
向着百万年薪努力的小赵
2022/12/02
2.4K0
HashMap为什么用链表加红黑树?目的是什么?原理是什么
Visual Studio 选择相同变量高亮
前段时间一直在使用matlab,今天需要使用vs2008,而用惯了matlab,习惯了其中一项选中变量高亮的设置,突然回来使用VS,感到各种不适应,顿时想到了一个词:矫情 呵呵,于是在网上找各种插件,
磊哥
2018/05/08
2.1K0
Visual Studio 选择相同变量高亮
Easyui Datagrid相同连续列合Demo之三
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/108858.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/19
4250
Easyui Datagrid相同连续列合Demo之三
Node.js 是什么?我为什么选择它?
当我们学习一项新的事物的时候,我们首先要知道它来自哪里?它是什么?能做什么或者换句话说,能解决什么问题?没有一样东西是最好的,是可以替代所有的,但在某一领域它是最适合的,正如 Node.js 它可能是某些程序员苦苦追寻的东西,也可能是某些程序员不会去关心的东西。本文主要为您介绍 Node.js 的背景及它能做什么,擅长什么,不会涉及到复杂的代码层面的知识讲解,如果你觉得自己很熟悉了,也可以忽略它。
五月君
2019/08/06
1.4K0
Hibernate中Session的load和get方法的区别是什么?
主要有以下三项区别: ① 如果没有找到符合条件的记录,get方法返回null,load方法抛出异常。 ② get方法直接返回实体类对象,load方法返回实体类对象的代理。 ③ 在Hibernate 3之前,get方法只在一级缓存中进行数据查找,如果没有找到对应的数据则越过二级缓存,直接发出SQL语句完成数据读取;load方法则可以从二级缓存中获取数据;从Hibernate 3开始,get方法不再是对二级缓存只写不读,它也是可以访问二级缓存的。
唐怀瑟
2018/08/30
8570
CSS 的多列布局是什么?
就是用 CSS 的 column-count、column-width、column-gap、break-inside、page-break-inside 等实现多列显示的功能。
Learn-anything.cn
2021/12/10
1.4K0
mybatis和hibernate的以及jpa区别_hibernate sql
hibernate和mybatis是当前流行的ORM框架。hibernate对数据库结构提供了较为完整的封装。mybatis主要着力点在于java对象与SQL之间的映射关系。
全栈程序员站长
2022/09/30
1.2K0
mybatis和hibernate的以及jpa区别_hibernate sql
hibernate Java 时间和日期类型的 Hibernate 映射
在 Java 中, 代表时间和日期的类型包含: java.util.Date 和 java.util.Calendar. 此外, 在 JDBC API 中还提供了 3 个扩展了 java.util.Date 类的子类: java.sql.Date, java.sql.Time 和 java.sql.Timestamp, 这三个类分别和标准 SQL 类型中的 DATE, TIME 和 TIMESTAMP 类型相应
全栈程序员站长
2022/07/12
1K0
hibernate Java 时间和日期类型的 Hibernate 映射

相似问题

为什么Hibernate要两次选择相同的列?

13

MySQL两次选择相同的列

23

对列选择相同数目的随机行

53

为什么Hibernate选择相同的列4次?对映射有帮助吗?

10

jpa原生查询,选择相同的表两次问题(hibernate实现)

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文