gpt4 book ai didi

mysql - JPA+Hibernate...关联不是单一查询,而是为join执行多个查询

转载 作者:行者123 更新时间:2023-12-04 15:55:51 25 4
gpt4 key购买 nike

我有两个名为 Banners 和 BannerGroup 的类。

我已经创建了双向关系。
就我而言,一个 BannerGroup 可以有多个 Banners,而 Many Banners 属于同一个 BannerGroup。

Mysql表是...

mysql> desc Banners;
+------------------+--------------+------+-----+---------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+-----------------------------+
| banner_id | int(11) | NO | PRI | NULL | auto_increment |
| banner_name | varchar(255) | YES | | NULL | |
| banner_group_id | int(11) | YES | MUL | NULL | |
+------------------+--------------+------+-----+---------+-----------------------------+

mysql> desc Banner_Group;
+---------------------+--------------+------+-----+----------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+--------------+------+-----+----------------+-----------------------------+
| group_id | int(11) | NO | PRI | NULL | auto_increment |
| group_name | varchar(255) | NO | MUL | NULL | |
+---------------------+--------------+------+-----+----------------+-----------------------------+

我的模型课是这样的...
Class Banners
{
private Integer bannerId;
private String bannerName;
private BannerGroup bannerGroupDO;

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "banner_id")
public Integer getBannerId() {
return bannerId;
}

public void setBannerId(Integer bannerId) {
this.bannerId = bannerId;
}

@Column(name = "banner_name")
public String getBannerName() {
return bannerName;
}

public void setBannerName(String bannerName) {
this.bannerName = bannerName;
}

@ManyToOne(fetch = FetchType.EAGER, optional=false)
@JoinColumn(name = "banner_group_id", nullable = false)
public BannerGroup getAffiliateBannerGroup() {
return bannerGroupDO;
}

public void setAffiliateBannerGroup(BannerGroup bannerGroupDO) {
this.bannerGroupDO = bannerGroupDO;
}
}

Class BannerGroup{

private int group_id;
private int group_name;
private List<Banners> banners;

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "group_id")
public Integer getGroupId() {
return groupId;
}

public void setGroupId(Integer groupId) {
this.groupId = groupId;
}

@Column(name = "group_name")
public String getGroupName() {
return groupName;
}

public void setGroupName(String groupName) {
this.groupName = groupName;
}

@OneToMany(mappedBy="bannerGroupDO", fetch = FetchType.LAZY)
public List<Banners> getBanners() {
return banners;
}

public void setBanners(List<Banners> banners) {
this.banners = banners;
}
}

现在,当我尝试获取 Banners(急切加载 BannerGroup)时
Query q = session.createQuery("from com.abc.xyz.model.Banners where bannerId = 123");

我懂了...
Hibernate: select b.banner_id as banner1_294_, b.banner_name as banner2_294_ from Banners b where b.banner_id=?
Hibernate: select bg.group_id as group1_295_0_, bg.group_name as group9_295_0_ from Banner_Group bg where bg.group_id=?

我想要的是: hibernate 应该 执行单个查询 而不是 多个(两个)查询 .
我希望 hibernate 应该触发 “内连接”查询...类似...
select b.*, bg.* from Banners b INNER JOIN Banner_Group bg ON b.banner_group_id=bg.group_id;

我的问题是...

1.) 为什么 hibernate 执行多个查询而不是单个查询,即使我已经指定了关联。 ?

2.) 我想为这个问题做些什么?

我不想执行 JPQL/HQL。我的意思是说,我只想获得行为形式的关联。我只想通过执行类似的查询来获得结果... from com.abc.xyz.model.Banners where bannerId = 123;
3.) 我知道...单独执行两个查询和单个查询的结果是相同的。但我认为这会影响 DB 的性能。或者它可能是 DB 的不公。我错了吗?

在 Radim Köhler 的回答之后……我在 Banners.java 中编辑了我的代码 ...(问题仍未解决)
@ManyToOne(fetch = FetchType.EAGER, optional=false)
@JoinColumn(name = "banner_group_id", nullable = false)
@Fetch(FetchMode.JOIN)
public AffiliateBannerGroup getAffiliateBannerGroup() {
return affiliateBannerGroup;
}

public void setAffiliateBannerGroup(AffiliateBannerGroup affiliateBannerGroup) {
this.affiliateBannerGroup = affiliateBannerGroup;
}

最佳答案

缺少的映射是

@Fetch(FetchMode.JOIN)

在此处查看更多信息: JPA eager fetch does not join .

EAGER 设置以不同的方式指示 Hibernate:不要等待加载实体及其引用。因此,即使在进一步处理中不使用它,也会加载引用。 LAZY 加载,在大多数情况下是首选和最合适的方式

关于mysql - JPA+Hibernate...关联不是单一查询,而是为join执行多个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19605356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com