使用 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(使用前将#替换为@)