当前位置: 首页 > 面试题库 >

使用GORM / Hibernate轻松加载查询

范飞翰
2023-03-14
问题内容

我的Grails应用程序具有以下域对象

class ProductType {
    String name
    static hasMany = [attributes: Attribute]
}

class Attribute {       
    String name
    static belongsTo = [productType: ProductType]
}

我的数据库有7 ProductTypes,每个都有3 Attributes。如果执行查询:

def results = ProductType.withCriteria {
    fetchMode("attributes", org.hibernate.FetchMode.EAGER)
}

我预计ProductType将返回7个实例,但实际上我得到21个(7 x 3)。我知道如果我要执行与上述相同的SQL查询,则结果集将有21行

prod1 | attr1
prod1 | attr2
prod1 | attr3
..... | .....
..... | .....
prod7 | attr1
prod7 | attr2
prod7 | attr3
-------------
Total 21

但是我认为当我通过Hibernate / GORM检索这些结果时,我应该会得到更多类似的信息:

prod1 | attr1, attr2, attr3    
..... | ...................
..... | ...................
prod7 | attr1, attr2, attr3
---------------------------
Total 7

顺便说一句,如果我从上面的查询中删除了eager-loading,我得到ProductType的期望值为7 s。我想念什么?


问题答案:

您应该阅读以下常见问题解答:对于为集合启用了外部联接获取的查询,Hibernate不会返回不同的结果(即使我使用了distinct关键字)?

如您注意到的那样,当您指定急切加载时,结果集包含7 * 3行,但实际上您的内存中只有7个productTypes对象(每个对象有2个额外的引用)。
要执行您想要的操作,您可以添加(请注意基础sql查询未更改):

SetResultTransformer(new DistinctRootEntityResultTransformer())

def results = ProductType.withCriteria {
    fetchMode("attributes", org.hibernate.FetchMode.EAGER)
    SetResultTransformer(new DistinctRootEntityResultTransformer())
}


 类似资料:
  • 问题内容: 我在每个项目中都有一个带有图像的android 。加载图像需要一段时间。每次加载图像时,如何添加“加载”动画? 我应该使用 .gif 吗?还是创建自己的动画并将其停止? 如果我使用“ picasso”,因为所有异步任务对开发人员来说都是黑匣子,并且我无法停止任何动画,该怎么办? 问题答案: 使用以下代码: MainActivity.java list_row.xml ListAdapt

  • 问题内容: 我有一个可以正常工作的Rest Web服务,它使用JBoss Resteasy,但是当我尝试移植它以使用GAE时,执行时出现此错误: 问题答案: 我在GAE上成功使用resteasy。正如csturtz所述,请确保您的项目具有resteasy依赖性。 如果您使用Maven,应该是这样的: 并且您还可以选择使用:

  • 轻松上传是魔方加密开发的快速上传组件。轻松上传的环境要求: Microsoft Windows 操作系统 Google Chrome 浏览器 使用步骤 安装轻松上传后,您可以通过以下步骤使用: 打开 Windows 资源管理器,选择需要上传的 PHP 文件 按下 CTRL+C 复制文件 打开魔方加密页面 按下 CTRL+V 粘贴文件 等待文件上传 安装方法 点击这里 打开 Chrome 网上应用店

  • 第一节 Go语言安装与测试 轻松友好的安装方式,多平台支持。 第二节 内置基础数据类型 认识Go提供的清晰的数据类型,很清晰,不骗你。 第三节 变量与常量定义 学语言绕不开的变量,当然Go是静态语言,变量都是有固定类型的,程序运行过程中无法改变变量类型。 第四节 控制流程 很简单,只有if,for,switch三种流程,连while都没有。 第五节 数组,切片和字典 内置高级数据类型。如果我们需要

  • Go轻松学是一款学习GoLang的小型学习App。基于Android平台。主要包含Go基础和Go实例两部分。 Go轻松学,可以让你随时随地浏览Go提供的独特功能,本应用提供了翔实的测试例程序,100%测试通过。并且可以根据反馈持续更新。在这里,变量,函数,结构体,指针,并行计算,包和测试都有详细的讲解。 Go基础部分由本人的读书笔记归纳整理而来,而实例部分则由网址http://gobyexampl

  • 问题内容: 我是python的新手(我使用python 3),并且我尝试使用JSon中的一个字符串和两个列表作为成员序列化一个类。我发现python标准中有一个json库,但似乎我需要手动实现序列化方法。是否有一个JSon编码器,我可以在其中简单地传递一个对象,并以字符串形式接收序列化的对象,而无需实现序列化方法。例: 谢谢。 问题答案: 不了解任何预构建的内容,但是如果您的对象足够简单,则可以编