Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jpa,Hibernate选择查询优化_Java_Hibernate_Jpa - Fatal编程技术网

Java Jpa,Hibernate选择查询优化

Java Jpa,Hibernate选择查询优化,java,hibernate,jpa,Java,Hibernate,Jpa,我是JPa/Hibernate新手。 我们在应用程序中使用JPA和hibernate。 目前,我观察到对带有条件的表执行select查询时,hibernate会对每一行执行select查询 所以我的问题是,hibernate如何在表上执行搜索并检索记录 我有一个需要查找活动用户的场景 并在活动用户列表上执行文件管理器,例如最近登录的用户、最受欢迎的用户(基于某些标准) 我有100个活跃用户,其中 最近有20个用户登录。 20个用户最受欢迎 如果我必须从数据库中获取记录, 当我查询活动用户时,hi

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

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

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

如果我必须从数据库中获取记录, 当我查询活动用户时,hibernate执行100个select操作。(使用表扫描)

及 如果我对最近和最受欢迎的用户执行两个单独的查询 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;
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name=“fk\u profile\u id”,referencedColumnName=“pk\u id”)
个人资料;
@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy=“investmentPitch”,targetEntity=InvestmentType.class,orphanRemoving=true)
私人上市投资类型;
@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy=“investmentPitch”,targetEntity=TabDetail.class,orphanRemoving=true)
私有列表选项卡详细信息;
@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy=“investmentPitch”,targetEntity=Address.class,orphanRemoving=true)
私人名单地址;
@ManyToMany(fetch=FetchType.LAZY,cascade=CascadeType.DETACH)
@JoinTable(name=“pitch_sector”,JointColumns={@JointColumn(name=“fk_id”,nullable=false,updateable=false)},InverseJointColumns={@JointColumn(name=“fk_sector_id”,nullable=false,updateable=false)})
私营部门;

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


您可以将此更改为LAZY。然后,仅当您首先访问配置文件对象时,才会触发选择。如果您必须访问每个选定用户的配置文件,这也会导致为每个用户选择。为了避免这种情况,您可以在一次选择中与用户一起预加载配置文件。有关这方面的详细信息,请参见以下链接:和

请发布您的映射和类。Hibernate不会用一次选择来检索所有记录。加载记录列表后,必须为每个记录加载一些映射(例如一对多)。我已更新了映射对象。。。它主要有一对多的关系。。。当我对上述表(investmentPitch)执行select时,它会使用select queryFetchType.EAGER查询每个记录。通常,这不是您想要做的。您可以测试并从配置文件中删除FetchType.EAGER吗?我认为这会触发一个选择,让每个加载的用户加载配置文件。感谢您的回复。。。实际上,我希望每次获取用户时都能加载配置文件,但我的实际问题是:当我对表执行select时,我希望通过调用“query.getResultList()”返回一个列表,所以我希望有一个select查询,但hibernate对单个记录执行select?为什么会这样?