为什么我的 HQL 查询急切加载惰性关联?

Why is my HQL query eager loading lazy associations?

我正在尝试提高我的 HQL 查询的性能,但我很困惑。我在 Adjuster、ZipCode 和 EagleUsers 对象上的 OneToOne 关联都标记为 FetchType.LAZY,但是当我使用此查询时它们会立即从数据库中提取。

session.createQuery(
            "FROM Adjuster a, ZipCode z, EagleUsers e WHERE a.eagleUsersByUserId = e.userId AND a.adjusterContact.zipCode = z.zip AND a.active = true AND a.isRecordDeleted = false"
            ).setMaxResults(1).list();

为什么要这样做?

SQL 输出:

Hibernate: select top 1 adjuster0_.AdjusterId as Adjuster1_2_0_, zipcode1_.ZipId as ZipId1_163_1_, eagleusers2_.UserId as UserId1_91_2_, adjuster0_.Active as Active2_2_0_, adjuster0_.AutoAssign as AutoAssi3_2_0_, adjuster0_.SupervisorId as Supervis6_2_0_, adjuster0_.UserId as UserId7_2_0_, adjuster0_.IsRecordDeleted as IsRecord4_2_0_, adjuster0_.IsW2 as IsW5_2_0_, zipcode1_.Areacode as Areacode2_163_1_, zipcode1_.City as City3_163_1_, zipcode1_.County as County4_163_1_, zipcode1_.DST as DST5_163_1_, zipcode1_.Latitude as Latitude6_163_1_, zipcode1_.Longitude as Longitud7_163_1_, zipcode1_.State as State8_163_1_, zipcode1_.Timezone as Timezone9_163_1_, zipcode1_.TimezoneOffset as Timezon10_163_1_, zipcode1_.Zip as Zip11_163_1_, eagleusers2_.FirstName as FirstNam2_91_2_, eagleusers2_.IsRecordDeleted as IsRecord3_91_2_, eagleusers2_.LastName as LastName4_91_2_, eagleusers2_.SubRoleId as SubRoleI5_91_2_ from eagle_prd.dbo.Adjuster adjuster0_ cross join eagle_prd.dbo.ZipCode zipcode1_ cross join eagle_prd.dbo.EagleUsers eagleusers2_ cross join eagle_prd.dbo.AdjusterContact adjusterco3_ where adjuster0_.AdjusterId=adjusterco3_.AdjusterId and adjuster0_.UserId=eagleusers2_.UserId and adjusterco3_.ZipCode=zipcode1_.Zip and adjuster0_.Active=1 and adjuster0_.IsRecordDeleted=0
Hibernate: select adjusterau0_.AdjusterId as Adjuster1_3_0_, adjusterau0_.CurrentWorkZipCode as CurrentW2_3_0_, adjusterau0_.ExcludeHomeZip as ExcludeH3_3_0_, adjusterau0_.HomeZipCode1 as HomeZipC4_3_0_, adjusterau0_.HomeZipCode2 as HomeZipC5_3_0_, adjusterau0_.IsRecordDeleted as IsRecord6_3_0_, adjusterau0_.MaxOneDayClaims as MaxOneDa7_3_0_, adjusterau0_.MaxOneWeekClaims as MaxOneWe8_3_0_, adjusterau0_.MaxTwoDayClaims as MaxTwoDa9_3_0_, adjusterau0_.VacationEnd as Vacatio10_3_0_, adjusterau0_.VacationStart as Vacatio11_3_0_, adjusterau0_.WebAssignments as WebAssi12_3_0_ from eagle_prd.dbo.AdjusterAutoAssign adjusterau0_ where adjusterau0_.AdjusterId=?
Hibernate: select adjusterco0_.AdjusterId as Adjuster1_7_0_, adjusterco0_.CarAllowance as CarAllow2_7_0_, adjusterco0_.IsRecordDeleted as IsRecord3_7_0_, adjusterco0_.PhoneAllowance as PhoneAll4_7_0_, adjusterco0_.PhotoPercentage as PhotoPer5_7_0_, adjusterco0_.SeviceFeePercentage as SeviceFe6_7_0_ from eagle_prd.dbo.AdjusterCompensation adjusterco0_ where adjusterco0_.AdjusterId=?
Hibernate: select adjusterco0_.AdjusterId as Adjuster1_8_0_, adjusterco0_.City as City2_8_0_, adjusterco0_.Fax as Fax3_8_0_, adjusterco0_.IsRecordDeleted as IsRecord4_8_0_, adjusterco0_.Mobile as Mobile5_8_0_, adjusterco0_.Phone as Phone6_8_0_, adjusterco0_.PhoneExt as PhoneExt7_8_0_, adjusterco0_.State as State8_8_0_, adjusterco0_.Street1 as Street9_8_0_, adjusterco0_.Street2 as Street10_8_0_, adjusterco0_.ZipCode as ZipCode11_8_0_ from eagle_prd.dbo.AdjusterContact adjusterco0_ where adjusterco0_.AdjusterId=?
Hibernate: select aspnetuser0_.UserId as UserId1_171_0_, aspnetuser0_.ApplicationId as Applicat7_171_0_, aspnetuser0_.IsAnonymous as IsAnonym2_171_0_, aspnetuser0_.LastActivityDate as LastActi3_171_0_, aspnetuser0_.LoweredUserName as LoweredU4_171_0_, aspnetuser0_.MobileAlias as MobileAl5_171_0_, aspnetuser0_.UserName as UserName6_171_0_ from eagle_prd.dbo.aspnet_Users aspnetuser0_ where aspnetuser0_.UserId=?
Hibernate: select aspnetmemb0_.UserId as UserId1_167_0_, aspnetmemb0_.ApplicationId as Applica21_167_0_, aspnetmemb0_.Comment as Comment2_167_0_, aspnetmemb0_.CreateDate as CreateDa3_167_0_, aspnetmemb0_.Email as Email4_167_0_, aspnetmemb0_.FailedPasswordAnswerAttemptCount as FailedPa5_167_0_, aspnetmemb0_.FailedPasswordAnswerAttemptWindowStart as FailedPa6_167_0_, aspnetmemb0_.FailedPasswordAttemptCount as FailedPa7_167_0_, aspnetmemb0_.FailedPasswordAttemptWindowStart as FailedPa8_167_0_, aspnetmemb0_.IsApproved as IsApprov9_167_0_, aspnetmemb0_.IsLockedOut as IsLocke10_167_0_, aspnetmemb0_.LastLockoutDate as LastLoc11_167_0_, aspnetmemb0_.LastLoginDate as LastLog12_167_0_, aspnetmemb0_.LastPasswordChangedDate as LastPas13_167_0_, aspnetmemb0_.LoweredEmail as Lowered14_167_0_, aspnetmemb0_.MobilePIN as MobileP15_167_0_, aspnetmemb0_.Password as Passwor16_167_0_, aspnetmemb0_.PasswordAnswer as Passwor17_167_0_, aspnetmemb0_.PasswordFormat as Passwor18_167_0_, aspnetmemb0_.PasswordQuestion as Passwor19_167_0_, aspnetmemb0_.PasswordSalt as Passwor20_167_0_ from eagle_prd.dbo.aspnet_Membership aspnetmemb0_ where aspnetmemb0_.UserId=?
Hibernate: select aspnetprof0_.UserId as UserId1_168_0_, aspnetprof0_.LastUpdatedDate as LastUpda2_168_0_, aspnetprof0_.PropertyNames as Property3_168_0_, aspnetprof0_.PropertyValuesBinary as Property4_168_0_, aspnetprof0_.PropertyValuesString as Property5_168_0_ from eagle_prd.dbo.aspnet_Profile aspnetprof0_ where aspnetprof0_.UserId=?
Hibernate: select eagleuseri0_.UserId as UserId1_90_0_, eagleuseri0_.MobilePhone as MobilePh2_90_0_, eagleuseri0_.OfficePhone as OfficePh3_90_0_ from eagle_prd.dbo.EagleUserInfo eagleuseri0_ where eagleuseri0_.UserId=?

hibernate Query.list() 函数获取完整的对象,包括它的引用,因为它创建了一个与 hibernate 范围分离的列表。