Jpa,Hibernate选择查询优化

时间:2013-05-23 10:57:35

标签: java hibernate jpa

我是JPa / Hibernate的新手。 我们在我们的应用程序中使用JPA和hibernate。 目前我观察到在带有条件的表上执行select查询,hibernate对每一行执行select查询。

所以我的问题是,hibernate如何在表上执行搜索并检索记录?

我有一个场景,我需要找到活跃的用户 并在活动用户列表上执行文件管理器,例如最近登录的用户,最受欢迎的用户(基于某些标准) 我有100个活跃用户 最近登录了20个用户。 20个用户最受欢迎。

如果我必须从数据库中获取记录, 当我与活跃用户查询时,休眠执行100次选择操作。(带表扫描)

和 如果我为最近和最受欢迎的用户执行2个单独的查询 hibernate将执行20 + 20 = 40次选择操作。 (但是有2次表扫描)

那么hibernate如何从数据库中提取记录? 如果我与jdbc比较,我会说通过获得主动音高并对其执行过滤器,我将进行1次表扫描。

但是对于hibernate,它执行更多的选择操作,当我为最近和最受欢迎的用户进行单独选择时,它会查询较少的选择,即使我进行2次时间表扫描!

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "fk_profile_id", referencedColumnName = "pk_id")
private Profile Profile;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "investmentPitch", targetEntity = InvestmentType.class, orphanRemoval = true)
private List<InvestmentType> investmentType;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "investmentPitch", targetEntity = TabDetail.class, orphanRemoval = true)
private List<TabDetail> TabDetail;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "investmentPitch", targetEntity = Address.class, orphanRemoval = true)
private List<Address> Address;

@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.DETACH)
@JoinTable(name = "pitch_sector", joinColumns = { @JoinColumn(name = "fk_id", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "fk_sector_id", nullable = false, updatable = false) })
private List<SectorMaster> sectors;

1 个答案:

答案 0 :(得分:2)

FetchType.EAGER会导致hibernate在加载User后直接加载配置文件。这会触发每个用户的选择。

您可以将此更改为LAZY。然后,只有在您首次访问配置文件对象时才会触发选择。如果您必须访问每个所选用户的配置文件,这也会导致每个用户选择。为避免这种情况,您可以在一次选择中将用户配置文件与用户一起预加载。有关此内容的详细信息,请参阅以下链接:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html#querycriteria-dynamicfetchinghttp://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html#performance-fetching