HQL语句中的join fetch

from Paper as paper join fetch paper.authors as authors where authors.id=‘xxxx‘;

from Paper as paper join fetch paper.authors where paper.authors.id=‘xxxx‘;

这两个语句有什么区别呢?通过最终生成的sql发现。

上面HQL生成最终sql(部分) from s_paper paper inner join s_paper_author author where author.paper_id=paper.id where author.id=‘xxx‘

下面HQL生成最终sql(部分) from s_paper paper inner join s_paper_author author where author.paper_id=paper.id,s_paper_author author1 where author1.paper_id=paper.id and author1.id=‘xxx‘

可以看出来,下面的多了一个关联。那么问题来了,这两个有什么区别呢?

通过测试发现,第一个sql最终查询的结果,如果论文作者有多个,加上子表的查询条件后,最终封装到实体类里面的却只有符合条件的一个子类(论文作者),但是少了一个关联查询,可以节省部分性能。

第二个sql最终查询的结果,是无论有多少个作者,全部都封装进来了。但是因为多关联了一次表查询,有部分性能损失。

综上,可以根据具体的场景来选择合适的关联方式。

时间: 2024-11-09 00:37:08

HQL语句中的join fetch的相关文章

HQL语句中数据类型转换

我们需要从数据库中取出序号最大的记录,想到的方法就是使用order by子句进行排序(desc倒序),然后取出第一个对象,可是当初设计数据库时(我们是在原来的数据库的基础上开发新系统),竟然将序号字段的类型设成了varchar2,真是让人郁闷,这样的话,如果排序的话,就是对字符串排序,12是比2小的数,那么就需要转换一下类型. 以下写法调整中是错误的,不能执行,报空指针错误:select cast(t.a as Integer) from table_1 t 我也使用了这段代码,同样报空指针异常

sql语句中left join、inner join中的on与where的区别

table a(id, type): id type ---------------------------------- 1 1 2 1 3 2 table b(id, class): id class --------------------------------- 1 1 2 2 sql语句1:select a.*, b.* from a left join b on a.id = b.id and a.type = 1; sql语句2:select a.*, b.* from a le

Hibernate的HQL语句中定位参数和具名参数传参

HQL查询: 1.有关hql 查询语句中的问好参数形式,如果出现多个问号,这对后面参数就比较麻烦. 如:from Student  student where student.name = ? and student.age=?.... 对这样的赋值,容易出错 可以采用另一种赋值的方法 如:from Student  student where student.name =:var1 and student.age=:var2.... query.setString("var1",&q

浅谈!SQL语句中LEFT JOIN ON WHERE和LEFT JOIN ON AND的区别

今天的工作学习之路是一个数据库的小知识,当时没有区分出所以然,特此记录分享一下子. 众所周知,数据库的表都是单独存在的,但是当我们进行联合查询(多表查询)时,我们获得数据库返回的值时就好像在一张表里一样,这是因为在进行联合查询时数据库会生成一个临时表返回给我们所想要的数据信息,这时我们都是通过LEFT JOIN 等语句进行相关联,并且我们也会为我们所想查询的数据进行一个筛选,这时我们就会用到过滤语句. LEFT JOIN ON WHERE:在临时表生成后,再对临时表的数据进行过滤,再返回左表.

sql语句中left join、right join、inner join的区别

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录: right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录:inner join(等值连接) 只返回两个表中联结字段相等的行. 我们建立两个简单的表A和B,如图所示: A:     B: 1)left join 我们执行sql语句:select * from A left join B  on A.id = B.id; 结果如下: 说明:left join是以A表的记录为基础的,A可以看成

albert1017 SQL语句中的JOIN语句

要理解join语句,首先得明白笛卡尔乘积(即集合的乘运算),其定义如下: 笛卡尔(Descartes)乘积又叫直积.假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}. 在SQL的join联结操作中,其实也是先对表做笛卡尔积,然后再对结果集合进行选取操作,选取满足条件的部分作为结果,这里需要注意的是,如何把表看做一 集合,本来表中是一个二维数据,我们把表中的一行数据(即一个记录)看做是这个表集合中的一

怎样在hibernate的HQL语句中使用mysql 的自定义函数?

问题:怎样在hibernate中使用mysql的函数? 1.hibernate支持原生态的sql语句查询,使用session.createSQLQuery()创建查询对象: 2.怎样在hql中使用mysql函数呢? 这时就需要重新定义hibernate的方言(dialect),将你需要用到的进行注册:  这里提到一个方言(dialect)的概念: Hibernate底层依然使用SQL语句来执行数据库操作,虽然所有关系型数据库都支持使用标准SQL语句,但所有数据库都对标准SQL进行了一些扩展,所以

hibernate中hql语句中list和iterate区别

1.使用list()方法获取查询结果,每次发出一条语句,获取全部数据.2.使用iterate()方法获取查询结果,先发出一条SQL语句用来查询满足条件数据的id,然后依次按照这些id查询记录,也就是要执行N+1条SQL语句(N为符合条件的记录数) 两次执行list()方法,每次执行都是发出一条SQL语句,查询所有数据.下面看看两次执行iterate()方法的输出情况两次执行iterate()方法,第一次执行时发出了N+1条SQL语句,而第二次执行,则只发出一套SQL语句,与先执行list()方法

hql语句中的select字句和from 字句

package com.imooc.model; import java.util.List; import java.util.Map; import org.hibernate.Query; import org.hibernate.Session; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.imooc.util.HibernateSessionFactory; pub