`
emavaj
  • 浏览: 49880 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hibernate 抓取 去除重复 解决方案

阅读更多

其实,对于Hibernate 的 Lazy

 

可以说是又爱又恨

 

不过好像细想,爱是自然,恨嘛...  个人觉得还是恨自己的技术不过关吧

 

Lazy 懒加载 和 Fetch 抓取

 

是对相反的东西

 

用好了相当于可以自由切换Hibernate配置中的 lazy = "xxx" 这个属性

 

情景:

 

一个 ACL 有很多 Power ,他们是一 (ACL) 对多 (Power) 关系

 

所有ACL端有

/**
	 * 权限实体集合
	 */
	@OneToMany(
			fetch=FetchType.LAZY,mappedBy="theAcl",cascade={CascadeType.REMOVE}
		)
	private Set<Power> powers;

 

可以看到,上面的Lazy已经是 true ,也就是这个powers会延迟加载

 

当然,我们可以用抓取fetch把powers强制加载上来

 

HQL 如下:

from ACL as a inner join fetch a.powers

 

但是,这样写...加载是加载上来了,但是 ACL 的记录条数重复了

 

发出的SQL如下:

Hibernate: 
    select
        acl0_.id as id19_0_,
        powers1_.id as id24_1_,
        acl0_.aclName as aclName19_0_,
        powers1_.isApply as isApply24_1_,
        powers1_.powerCreate as powerCre3_24_1_,
        powers1_.powerDelete as powerDel4_24_1_,
        powers1_.powerLoad as powerLoad24_1_,
        powers1_.powerName as powerName24_1_,
        powers1_.theAcl_id as theAcl8_24_1_,
        powers1_.powerUpdate as powerUpd7_24_1_,
        powers1_.theAcl_id as theAcl8_0__,
        powers1_.id as id0__ 
    from
        t_acl acl0_ 
    inner join
        t_power powers1_ 
            on acl0_.id=powers1_.theAcl_id

 

 

也就是 select 后面,字段上也跟上了 t_power这个表的内容

 

所以记录会重复...

 

解决方案就是加上:  distinct 关键字

 

HQL如下:

select distinct a from ACL as a inner join fetch a.powers

 

 

也就是让ACL 唯一 (其实就是ACL的主键唯一)

 

发出SQL如下:

Hibernate: 
    select
        distinct acl0_.id as id19_0_,
        powers1_.id as id24_1_,
        acl0_.aclName as aclName19_0_,
        powers1_.isApply as isApply24_1_,
        powers1_.powerCreate as powerCre3_24_1_,
        powers1_.powerDelete as powerDel4_24_1_,
        powers1_.powerLoad as powerLoad24_1_,
        powers1_.powerName as powerName24_1_,
        powers1_.theAcl_id as theAcl8_24_1_,
        powers1_.powerUpdate as powerUpd7_24_1_,
        powers1_.theAcl_id as theAcl8_0__,
        powers1_.id as id0__ 
    from
        t_acl acl0_ 
    inner join
        t_power powers1_ 
            on acl0_.id=powers1_.theAcl_id

 

成功解决!

 

PS : 当然我上面用了 inner join fetch,改成left join 更好

 

分享到:
评论

相关推荐

    Hibernate 多数据库支持解决方案

    未来 Hibernate是一个强大的Java持久化框架...以上各点提供了实现这一目标的基础,但实际项目中可能还需要解决更多特定于数据库的问题。通过良好的设计和测试,可以确保Hibernate应用程序在多种数据库环境下稳定运行。

    很不错的Hibernate解决方案.pdf

    在此背景下,《很不错的Hibernate解决方案》一文介绍了一种基于Hibernate框架的物流系统持久层解决方案,旨在解决当前物流系统中存在的问题,并提升整体性能。 #### Hibernate框架简介 Hibernate是一种开放源代码的...

    day36 08-Hibernate抓取策略:批量抓取

    为了解决这个问题,Hibernate提供了几种抓取策略,包括批量抓取和预加载。 批量抓取允许我们在一次查询中获取多个关联对象,而不是逐个加载。例如,如果我们有一个`User`实体,每个用户都有多个`Order`,我们可以...

    hibernate抓取策略和懒加载案例

    在Java的持久化框架Hibernate中,数据访问优化是至关重要的,而抓取策略(Fetch Strategy)和懒加载(Lazy Loading)则是实现这一目标的关键技术。本文将深入探讨这两个概念,并通过具体的案例进行分析。 首先,让...

    day36 06-Hibernate抓取策略:set集合上的抓取策略

    为了解决这个问题,Hibernate提供了不同的抓取策略。 1. **批处理抓取(Batch Fetching)**:这是一种优化技术,可以一次从数据库获取多个关联的实体。对于set集合,我们可以设置`@Fetch(FetchMode.BATCH)`来指定...

    解决在同一项目中Hibernate与Mybatis共存的问题的解决方案.docx

    Hibernate封装了很多有用的API给开发者,降低了操作数据库的难度和复杂度,同时也减少了模板代码的数量,但Hibernate留给开发者可操作的空间相对Mybatis少了很多。 Mybatis框架使用起来很灵活,开发者可以自定义查询...

    hibernate的中文问题的解决方案

    ### Hibernate中文问题解决方案 在开发基于Java的应用程序时,Hibernate作为一个强大的对象关系映射(ORM)框架被广泛采用。然而,在处理中文字符时,开发者可能会遇到各种各样的问题,如乱码显示等。本文将详细...

    HibernateSpring多数据库解决方案.doc

    总结起来,这个多数据库解决方案利用Spring的IoC容器管理和配置了多个数据源,同时结合Hibernate提供了ORM功能。通过`OpenSessionInView`模式,确保了Web请求中的持久化操作能在合适的Session上下文中进行。这样的...

    hibernate常见错误解决方案

    ### Hibernate常见错误解决方案 在开发基于Hibernate框架的应用程序时,我们经常会遇到各种各样的异常情况。这些异常不仅会影响系统的正常运行,还可能增加调试难度。本文将针对几个常见的Hibernate异常进行详细...

    Hibernate下数据批量处理解决方案

    对于更新和删除操作,可以使用`scroll()`方法,这在Hibernate 2.1.6或更高版本中是支持的。`scroll()`方法返回一个`ScrollableResults`对象,允许我们以游标方式处理结果集,这在处理大量数据时非常有效。同样,我们...

    day36 07-Hibernate抓取策略:many-to-one上的抓取策略

    为了解决这个问题,我们可以使用预加载(eager loading)或者子集加载(fetch plan)等抓取策略。 在"many-to-one"关系中,一个实体可以与多个其他实体相关联。默认情况下,Hibernate会设置这种关联为懒加载,即...

    Struts+Spring+Hibernate通用分页解决方案

    "Struts+Spring+Hibernate通用分页解决方案"是针对基于这三大框架(Struts、Spring、Hibernate)的Java Web应用所设计的一种高效且可复用的分页策略。以下是关于这个主题的详细解释: 1. **Struts框架**:Struts是...

    weblogic10 与hibernate冲突解决方案 linux windows环境全解

    weblogic10 与hibernate冲突解决方案 错误如下:org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken linux windows 环境解决方案全解 Linux 启动脚本添加如下: export USER_...

    Hibernate 删除出现异常的解决方案.doc

    在使用Hibernate进行数据库操作时,有时会遇到一种异常情况,即在尝试删除一个对象时,系统抛出"deleted object would be re-saved by cascade (remove deleted object from associations)"的异常。这个异常通常发生...

    Hibernate中大量数据的更新

    在 Hibernate 配置文件中,可以设置 `hibernate.jdbc.batch_size` 参数来指定批量抓取的大小。 如何实现批量更新 在 Controller 层,需要将大量数据插入到数据库时,可以使用以下方法: ```java for (int i = 0; ...

    hibernate锁实验,以及解决方案

    本文将深入探讨在使用Hibernate进行数据库操作时遇到的锁问题,并提供相应的解决方案。 首先,我们要理解数据库中的锁机制。在多用户并发环境中,为了保证数据的一致性和完整性,数据库系统通常会采用不同类型的锁...

    hibernate实现动态表查询的多种解决方案

    ### Hibernate 实现动态表查询的多种解决方案 #### 一、前言 在使用Hibernate进行数据库操作时,我们经常需要根据不同的需求对不同的表进行查询。特别是在处理多表、多库等复杂场景时,如何实现动态表查询就显得尤...

Global site tag (gtag.js) - Google Analytics