Grails 中 findAll、getAll 和 list 的区别

2024-04-29

使用 Grails 有多种方法可以完成同一件事。

查找所有域类实例:

Book.findAll()
Book.getAll()
Book.list()

检索指定 id 的域类的实例:

Book.findById(1)
Book.get(1)

你什么时候使用每一个?性能上有显着差异吗?


getAll是一个增强版本get需要多个 id 并返回一个List实例数。列表大小将与提供的 id 数量相同;任何遗漏都会导致null在那个槽位。看http://grails.org/doc/latest/ref/Domain%20Classes/getAll.html http://grails.org/doc/latest/ref/Domain%20Classes/getAll.html

findAll允许您使用 HQL 查询并支持分页,但它们不限于调用类的实例,因此我使用executeQuery反而。看http://grails.org/doc/latest/ref/Domain%20Classes/findAll.html http://grails.org/doc/latest/ref/Domain%20Classes/findAll.html

list查找所有实例并支持分页。看http://grails.org/doc/latest/ref/Domain%20Classes/list.html http://grails.org/doc/latest/ref/Domain%20Classes/list.html

get通过 id 检索单个实例。它使用instance缓存,因此同一 Hibernate 会话中的多个调用最多将导致一次数据库调用(例如,如果实例位于二级缓存中并且您已启用它)。

findById是一个动态查找器,例如findByName, findByFoo等。因此,它不使用实例缓存,但如果启用了查询缓存,则可以进行缓存(通常不是一个好主意)。get应该是首选,因为它的缓存更加智能;缓存的查询结果(即使是像这样的单个实例)被悲观地清除的频率比您预期的要高,但实例缓存不需要如此悲观。

我想要的一个用例findById是作为与安全相关的检查,与另一个属性相结合。例如,而不是检索CreditCard实例使用CreditCard.get(cardId),我会找到当前登录的用户并使用CreditCard.findByIdAndUser(cardId, user)。这假设CreditCard has a User user财产。这样两个属性都必须匹配,这将阻止黑客访问卡实例,因为卡 ID 可能匹配,但用户不会匹配。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Grails 中 findAll、getAll 和 list 的区别 的相关文章

随机推荐

  • Bash 函数中的返回值

    我正在使用 bash 脚本 我想执行一个函数来打印返回值 function fun1 return 34 function fun2 local res fun1 echo res 当我执行时fun2 它不打印 34 为什么会这样呢 虽然
  • 绝对定位但调整父级的大小

    我正在尝试编写一个 div 中包含 2 个 div 的 html 代码 有一个没有宽度和高度的父div 宽度是浏览器宽度 没有指定高度 我想要在这个父 div 内有 2 个 div 第一个需要具有宽度或 250px 第二个需要具有屏幕宽度的
  • 从 len 18000 的 Dask 数据帧中采样 n= 2000 会生成错误 当“replace=False”时,无法获取比总体更大的样本

    我有一个从 csv 文件创建的 dask 数据框 len daskdf 返回 18000 但当我ddSample daskdf sample 2000 我收到错误 ValueError Cannot take a larger sample
  • 将命令行参数传递给可运行的 JAR [重复]

    这个问题在这里已经有答案了 我从 Eclipse 项目构建了一个可运行的 JAR 用于处理给定的 XML 文件并提取纯文本 但是 此版本要求将该文件硬编码在代码中 有没有办法做这样的事情 java jar wiki2txt enwiki 2
  • Apache NiFi 替换文本处理器以使用控制字符作为分隔符

    在将固定宽度文件转换为用普通字符 如 分隔时使用替换文本处理器 作为分隔符正在起作用 然而 考虑 u0001 或 A 或 A 并不能按预期工作 使用您可以使用的特殊字符literal unescapeXmlnifi表达函数 literal
  • 如何将 JavaScript 数组转换为特定的对象列表

    我有一个像这样的数组 empName Sushant departments HR DEV empName Prashant departments HR MNGT 我想把这个数组转换成 Sushant HR Prashant HR Sus
  • React 有传递 props 的简写吗?

    我厌倦了一直这样做
  • RxJava 相当于 orElse 是什么

    在其他语言的流 函数域中有一个常见的操作 那就是 orElse 它就像一个 if 当当前链没有得到任何结果时 它会更改为备用链 在具有 Maybe 类型的语言中 它基本上会继续 Some 类型的链或更改为 None 类型的 orElse 理
  • 添加样式后如何重置回默认CSS?

    基本上 我通过添加如下样式类来更改 javafx 中文本字段的 css textfield getStyleClass add textfieldstyle 但后来我希望能够将其恢复到原来的样子 但由于本例中的原始外观是 JavaFX 的默
  • Xcode 6 找不到 cocoapods 库

    我正在尝试构建一个使用 CocoaPods 的 Xcode 5 项目 POD 文件如下 target MyProjectName do pod AFNetworking 2 2 1 pod SVProgressHUD 0 9 pod MDH
  • 出现致命错误 Uncaught CurlException: 26: 无法打开文件

    我正在尝试使用 PHP 的 GD 库创建朋友的动态图像 并且需要将其上传到我的朋友个人资料中 但我不断收到错误消息 致命错误 未捕获的 CurlException 26 无法打开第 820 行 home p170r760 public ht
  • “不能从静态上下文引用非静态方法”JPA Java

    我从这一行收到 无法从静态上下文引用非静态方法 错误 createStudent stu00001 new Date 631152000000 m WB new Type Name Bob Smith 如何正确组成 日期 我查看了 API
  • 虚拟类作为 Spirit 的 AST 节点

    我当时正在和一个朋友一起开发一种语言的解释器 我们从一个我猜想不太明智的决定开始 我们首先制作所有用于执行的元素 实际上是由不同类组成的树 但现在看着 boost 的例子 我对如何合并两者感到很困惑 我知道从什么开始 语法 我知道要达到什么
  • ImportError:尝试在没有已知父包的情况下进行相对导入[重复]

    这个问题在这里已经有答案了 我正在学习使用 python 编程 并且在从包中的模块导入时遇到问题 我正在使用 Visual Studio 代码和 Python 3 8 2 64 位 我的项目目录 https i stack imgur co
  • 通过getattr动态获取dict元素?

    我想动态查询我想要检索的类中的哪些对象 getattr似乎是我想要的 并且它对于类中的顶级对象表现良好 但是 我还想指定子元素 class MyObj object def init self self d a 1 b 2 self c 3
  • 如何分叉我自己的 GitHub 存储库?

    所以 Git 的完全新手 阅读了指南 认为我已经具备了基础知识 但在实现这一目标时遇到了困难 我为我的通用标记源代码创建了一个存储库 只是我每次突破时都会重复使用的东西 它被称为markupDNA git 我想在我的 mac 站点目录中有不
  • 如何使用 Retrofit 2 下载 pdf 文件

    我在下载带改造的 pdf 文件时遇到困难 我的代码生成了一个文件 但它的大小错误 并且当 pdf 打开时它是空白的 这就是我的 php web 服务返回 pdf 文件的方式 param Slim Slim app param String
  • 如何打开电子邮件应用程序到特定文件夹PowerShell?

    我想从 PowerShell 打开特定帐户内特定文件夹的 Windows Mail 应用程序 这可能吗 我从中学到了这个帖子 https stackoverflow com questions 37331949 how to start m
  • 更改 WPF 中 Canvas 的坐标系

    我正在编写一个地图应用程序 它使用 Canvas 来定位元素 对于每个元素 我必须以编程方式将元素的纬度 经度转换为画布的坐标 然后设置 Canvas Top 和 Canvas Left 属性 如果我有一个 360x180 画布 我可以将画
  • Grails 中 findAll、getAll 和 list 的区别

    使用 Grails 有多种方法可以完成同一件事 查找所有域类实例 Book findAll Book getAll Book list 检索指定 id 的域类的实例 Book findById 1 Book get 1 你什么时候使用每一个