`
anson_xu
  • 浏览: 505894 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类

hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题

阅读更多

hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题

 

@OneToMany(cascade = CascadeType.ALL, mappedBy = "vote", fetch = FetchType.lazy)   //fetch = FetchType.EAGER这样是否在session.find()时会马上关联查出子表呢?
 @JoinColumn(name="voteId")
 // Fetch策略定义
 @Fetch(FetchMode.join)

 

//如果设FetchMode.join会生成left outer join语句,这样出来的结果,就可能重复,一条主表记录对多条子表记录

遍历时会有与子表数里相等的记录list

 

//所以可以用session.find(from model a where a.x=?)

//同时把fetch = FetchType.eager会执行查询主表和子表

 

Hibernate:
    select
        this_.voteId as voteId23_0_,
        this_.arrangeMode as arrangeM2_23_0_,
        this_.audit as audit23_0_,
        this_.endTime as endTime23_0_,
        this_.isopened as isopened23_0_,
        this_.notice as notice23_0_,
        this_.popularity as popularity23_0_,
        this_.startTime as startTime23_0_,
        this_.status as status23_0_,
        this_.voteADNewName as voteADN10_23_0_,
        this_.voteADOldName as voteADO11_23_0_,
        this_.voteCity as voteCity23_0_,
        this_.voteCompany as voteCom13_23_0_,
        this_.voteInfoTitle as voteInf14_23_0_,
        this_.voteLimit as voteLimit23_0_,
        this_.voteMaker as voteMaker23_0_,
        this_.voteMode as voteMode23_0_,
        this_.voteName as voteName23_0_,
        this_.votePicNewName as votePic19_23_0_,
        this_.votePicOldName as votePic20_23_0_,
        this_.voteProvince as votePro21_23_0_,
        this_.voteRemark as voteRemark23_0_,
        this_.voteType as voteType23_0_,
        this_.voterInfo as voterInfo23_0_,
        this_.voterName as voterName23_0_
    from
        Vote this_
    where
        this_.voteMaker=?
Hibernate:
    select
        votecustom0_.voteId as voteId1_,
        votecustom0_.voteCustomApplyId as voteCust1_1_,
        votecustom0_.voteCustomApplyId as voteCust1_26_0_,
        votecustom0_.status as status26_0_,
        votecustom0_.voteId as voteId26_0_,
        votecustom0_.voteApplyName as voteAppl3_26_0_,
        votecustom0_.voteApplyTypeId as voteAppl4_26_0_
    from
        VoteCustomApply votecustom0_
    where
        votecustom0_.voteId in (
            select
                this_.voteId
            from
                Vote this_
            where
                this_.voteMaker=?
        )
    order by
        votecustom0_.voteCustomApplyId asc

 //----页面取子表的数据时还是没有子表数据

 

如果用session.find("FROM Vote v left join fetch v.voteCustomApplys WHERE v.voteMaker='"+voteMaker+"'")

 

去倒页面还没不能加载到子表

必须把fetch = FetchType.eager

 

 

分享到:
评论
2 楼 Matchstick 2012-06-04  
使用SELECT DISTINCT alias FROM PojoName alias LEFT JOIN FETCH ...
即可解决。
1 楼 dlheart 2012-05-14  
没看懂你什么意思啊,我遇到的问题是一对多,设了fetch = FetchType.eager,结果查出来的对象有重复,是怎么回事啊,但是数据库对象一的一方只有一条数据,多的一方是两天,结果查出来一的一方成了两条数据了,里面的对象是完全一样的

相关推荐

    hibernate代码优化基于配置的多表查询

    通过子查询或`@Fetch(FetchMode.JOIN)`可避免此问题。 8. **使用投影(Projection)**: 在查询时,只获取需要的字段,可以减少返回结果的大小,从而提高性能。可以使用`Projections`类来创建投影查询。 9. **...

    hibernate一对多实例

    使用`@Fetch(FetchMode.JOIN)`可以解决这个问题,通过外连接一次性获取所有数据。 六、总结 理解并熟练运用Hibernate的一对多关系是Java开发中必备的技能之一。通过正确配置实体类和处理关联操作,我们可以有效地...

    Hibernate 系列教程 单向一对多

    为了提高性能,我们可以使用`fetch="join"`(XML映射)或`@Fetch(FetchMode.JOIN)`(注解)进行联合查询,一次性获取所有关联的数据。 理解并熟练掌握Hibernate的单向一对多关联,能够帮助开发者更高效地处理复杂的...

    hibernate-annotations-3.4.0.GA.rar

    - `@Fetch(FetchMode.JOIN)`: 实时加载,查询时将关联数据一同加载。 7. **索引与唯一性** - `@Index`: 在表中创建索引,提升查询性能。 - `@UniqueConstraint`: 定义表中某列或一组列的唯一性约束。 8. **继承...

    hibernate-release-4.3.9.Final.rar

    - 避免N+1查询问题:通过HQL的JOIN子句或Criteria的FetchMode.JOIN获取关联数据。 - 分页查询:使用Query的setFirstResult和setMaxResults方法,减少返回结果量。 通过深入理解Hibernate 4.3.9.Final,开发者可以...

    Hibernate一对多

    使用`fetch="join"`或`@Fetch(FetchMode.JOIN)`可以避免多次查询数据库,提高效率。另外,使用`@LazyCollection(LazyCollectionOption.EXTRA)`或`@OneToMany(mappedBy ..., fetch = FetchType.LAZY)`可以实现懒加载...

    hibernate的n+1问题.docx

    这不仅增加了数据库的访问压力,而且在处理大量数据时,性能问题尤为突出。 为了解决这个问题,Hibernate提供了两种主要的检索策略:延迟检索和迫切左外连接检索。 1. **延迟检索策略**:这种策略允许我们在需要时...

    hibernate(多对多关系映射)

    因此,需要根据实际情况考虑是否使用`fetch`策略,如`@Fetch(FetchMode.JOIN)`,以一次性加载关联数据。 通过理解以上知识点,你可以有效地使用Hibernate实现多对多关系映射,并在实际项目中进行高效的数据操作。...

    Hibernate一对多,多对一映射

    此外,还可以通过fetch模式(Fetch Mode)来控制加载策略,如`@Fetch(FetchMode.JOIN)`可以实现关联对象的联合查询。 为了确保数据的完整性和一致性,Hibernate提供了级联操作(Cascading Operations)。级联操作...

    hibernate5--4.检索方式及策略

    1. **FetchMode.JOIN**: 这种策略用于一次性加载关联的对象,避免了N+1查询问题。当查询主对象时,会同时加载与之关联的所有子对象。例如,`criteria.setFetchMode("address", FetchMode.JOIN)` 会将User对象的...

    hibernate3.2(六)多对一关联映射

    在本篇关于“Hibernate3.2(六)多对一关联映射”的主题中,我们将深入探讨在Java Persistence API(JPA)框架下,如何利用Hibernate实现多对一的关联映射。Hibernate作为JPA的一个实现,是Java开发中常用的ORM...

    hibernate N+1问题解决办法

    1. **批处理(Batch Size)**: 设置关联集合的批处理大小,通过`@Fetch(FetchMode.JOIN)`和`@BatchSize(size = 20)`注解,可以告诉Hibernate在查询订单时一起加载一定数量的产品,减少数据库访问次数。 2. **子查询...

    hibernate_test5.zip

    4. **多表查询**:利用`JOIN`、`LEFT JOIN`等HQL语句进行多表联合查询,或使用`Criteria API`构建复杂的查询条件。 四、源码解析 在`hibernate_test5.zip`中,你可以找到具体的示例代码。从`SessionFactory`的创建...

    Hibernate映射关系一对多

    此外,合理使用`fetch`策略(如`@Fetch(FetchMode.JOIN)`)可以避免N+1查询问题,提高查询效率。 通过上述讲解,我们了解了如何在Hibernate中配置和使用一对多映射关系,包括XML映射、注解映射、懒加载、级联操作...

    hibernate多对多单向关联

    由于多对多关联通常涉及中间表的查询,因此在进行关联查询时,需要考虑N+1查询问题。使用`@Fetch(FetchMode.JOIN)`或`@BatchSize`可以优化查询性能。同时,根据业务需求,可能还需要考虑是否使用`@LazyCollection...

    How to solve the hibernate N+1 problem?

    N+1问题是指在进行一对多或多对多关联查询时,原本期望通过一次SQL查询获取所有数据,但实际执行了N+1次查询,其中N为一端实体的数量,这极大地影响了应用性能。 描述中提到的链接指向了一篇博客文章,虽然具体内容...

    hibernate的多种映射关系

    `@JoinColumn` 用于定义外键列,而 `@Fetch(FetchMode.JOIN)` 可以优化查询性能。 3. **多对一映射 (Many-to-One)** 多对一与一对多是相反的关系,即多个实体可以与单个实体关联。这在 Java 类中通过在子类使用 `@...

    Hibernate Fetch 的作用

    正确理解hibernate fetch 的作用

    Hibernate多对一配置

    在Java的持久化框架Hibernate中,"多对一"(ManyToOne)关系是常见的数据库关联映射类型之一。这种关系表示在一个实体类中可以引用另一个实体类的多个实例,而被引用的实体类可能被多个实例引用。在实际的业务场景中...

Global site tag (gtag.js) - Google Analytics