【问题标题】:Why is my HQL query eager loading lazy associations?为什么我的 HQL 查询急于加载惰性关联?
【发布时间】:2016-01-05 05:53:56
【问题描述】:

我正在尝试提高 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 怎么知道它需要查询哪些 Adjuster、ZipCode 和 EagleUsers?您能否发布查询日志并指出您认为不合逻辑的地方?
  • @MartijnBurger 我希望它能够抓取 Adjuster、ZipCode 和 EagleUsers——我不希望它做的是抓取它们的每个子对象,也不抓取子对象的每个子对象对象等
  • 我猜是 list() 方法正在这样做。当你关闭它时会发生什么。 BTW:list() 方法不是 Query 接口的一部分,它是从哪里来的? docs.oracle.com/javaee/7/api/javax/persistence/Query.html

标签: java sql-server hibernate hql


【解决方案1】:

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

【讨论】:

  • 那如何在不拉下整个对象图的情况下查询数据库呢?
  • 这是一个完全不同的问题。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-19
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
相关资源
最近更新 更多