Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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
Mysql JPA&x2B;Hibernate…关联不是执行单个查询,而是为联接执行多个查询_Mysql_Hibernate_Jpa - Fatal编程技术网

Mysql JPA&x2B;Hibernate…关联不是执行单个查询,而是为联接执行多个查询

Mysql JPA&x2B;Hibernate…关联不是执行单个查询,而是为联接执行多个查询,mysql,hibernate,jpa,Mysql,Hibernate,Jpa,我有两个名为Banners和BannerGroup的类 我创造了双向关系。 在我的例子中,一个BannerGroup可以有许多横幅,并且许多横幅属于同一个BannerGroup Mysql表是 mysql> desc Banners; +------------------+--------------+------+-----+---------+-----------------------------+ | Field | Type | Null

我有两个名为Banners和BannerGroup的类

我创造了双向关系。 在我的例子中,一个BannerGroup可以有许多横幅,并且许多横幅属于同一个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;
    }
}
我有这个

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。我的意思是说,我只想从协会获得行为。我只想通过执行如下查询得到一个结果<代码>来自com.abc.xyz.model.Banners,其中bannerId=123

我知道。。。单独执行两个查询和单个查询的结果相同。但我认为这会影响DB的性能。或者可能是DB的布鲁登。我错了吗

在拉迪姆·克勒的回答之后。。。我已经在banner.java中编辑了我的代码(问题仍然没有解决)


缺少的映射是

@Fetch(FetchMode.JOIN)
请参阅此处的详细信息:


“急切”设置以另一种方式指示Hibernate:不要等待加载实体及其引用。因此,即使未在进一步处理中使用,也会加载引用。延迟加载,在大多数情况下是首选的,也是最合适的方式

我已经检查过了。。。我把@Fetch(FetchMode.JOIN)放在我的banner类中。(因为我试图加载Banner类的对象。)但同样的结果。。。正在执行两个单独的查询。。。(我正在mysql的一般日志中查看这一点。)请投票给你答案。。。因为我不知道FetchMode。你的回答给了我一个新的方向。总的来说,我强烈建议,使用LAZY和fetch模式选择而不是JOIN。。。在映射的内部。当您间接(通过引用)选择实体时,这将在场景中为您带来优势。在查询(session.createCriteria)时,您有更多的自由和能力来有效地加载数据。您可以连接更多的表,只需要很少的列(投影)。。。但是映射本身应该是懒惰的,而不是急切的。我会说;)另外,尝试检查批量大小setting@MananShah请尝试检查此链接:。您的HQL应该显式连接。还有一个很好的解释:
@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)