- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用Grails v3.3.9。
我无法查询到急切加载一对多关联的查询。尝试了各种方式。
这是相对于在单元测试中尝试使用它而发布的(在运行时在应用程序上也失败)。
场景:我有两个域类,一个叫做'OrgRoleInstance',它具有Collection<Site>
站点,另一个是static hasMany =[sites:Site]
,另一个叫'Site',其具有static belongsTo = [org:OrgRoleInstance]
。
这是从组织到站点的双向一对多。
我使用新的DomainUnitTest特性创建一个新的单元测试。在测试设置中,我创建了三个组织,每个组织添加一个站点,然后向第三个组织(组织“C”)添加了最后一个站点。安装程序可以正常运行,并且所有实例均保留下来。
在where查询测试中,我寻找一个具有2个站点的组织(即组织“C”)。
当我在调试中运行测试时,where查询返回一个包含组织“C”的大小为1的数组,因此where子句中的测试可以看到sites集合不是null-到目前为止很好。
我也直接执行Site.get(4)来获取最后一个站点。我进行了断言检查,以确保sites.org ref与where查询返回的实例相同。这是事实,并且过去了。
但是,当您查看orgs [0]条目时,sites集合为null。通过访问查询返回的空网站属性,该简单的println失败。
class OrgRoleInstanceSpec extends Specification implements DomainUnitTest<OrgRoleInstance> {
def setup() {
OrgRoleInstance
List<OrgRoleInstance> orgs = []
["A","B","C"].each {
OrgRoleInstance org = new OrgRoleInstance(name:it, role:OrgRoleInstance.OrgRoleType.Customer)
org.addToSites(new Site( name: "$it's Head Office", status:"open", org:org))
orgs << org
}
orgs[2].addToSites (new Site( name: "${orgs[2].name}'s Branch Office", status:"open", org:orgs[2]))
OrgRoleInstance.saveAll(orgs)
assert OrgRoleInstance.count() == 3
println "# of sites : " + Site.count()
assert Site.count() == 4
assert Site.get(2).org.id == orgs[1].id
}
void "where query and individual get " () {
given :
def orgs = OrgRoleInstance.where {
sites.size() == 2
}.list(fetch:[sites:"eager"])
def org = OrgRoleInstance.get(2)
List orgSites = org.sites
def branch = Site.get(4)
assert branch.org.is (orgs[0]) //assert is true
println orgs[0].sites[1].name //orgs[0].sites is null !
expect:
orgs.size() == 1
}
}
findAll(fetch:[sites:"eager")
等尝试过
import com.softwood.domain.*
def orgs = OrgRoleInstance.where {
id == 4
sites{}
}.list() /* (fetch:[sites:"eager"]) */
println orgs[0].sites
groovy> import com.softwood.domain.*
groovy> def orgs = OrgRoleInstance.where {
groovy> id == 4
groovy> sites{}
groovy> }.list() /* (fetch:[sites:"eager"]) */
groovy> println orgs[0].sites
2019-01-23 14:02:00.923 DEBUG --- [ Thread-18] org.hibernate.SQL :
select
this_.id as id1_16_1_,
this_.version as version2_16_1_,
this_.role as role3_16_1_,
this_.name as name4_16_1_,
sites_alia1_.id as id1_21_0_,
sites_alia1_.version as version2_21_0_,
sites_alia1_.org_id as org_id3_21_0_,
sites_alia1_.name as name4_21_0_,
sites_alia1_.status as status5_21_0_
from
org_role_instance this_
inner join
site sites_alia1_
on this_.id=sites_alia1_.org_id
where
this_.id=?
2019-01-23 14:02:00.923 TRACE --- [ Thread-18] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [4]
2019-01-23 14:02:00.923 DEBUG --- [ Thread-18] org.hibernate.SQL :
select
sites0_.org_id as org_id3_21_0_,
sites0_.id as id1_21_0_,
sites0_.id as id1_21_1_,
sites0_.version as version2_21_1_,
sites0_.org_id as org_id3_21_1_,
sites0_.name as name4_21_1_,
sites0_.status as status5_21_1_
from
site sites0_
where
sites0_.org_id=?
2019-01-23 14:02:00.923 TRACE --- [ Thread-18] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [4]
[Site:(name : 1 Barkley Square) belonging to org: com.softwood.domain.OrgRoleInstance : 4, Site:(name : 10 South Close) belonging to org: com.softwood.domain.OrgRoleInstance : 4]
org.hibernate.FetchMode
,然后withCriteria闭包中的根级别的fetchMode函数现在可以使用。最后,只需对集合执行空关闭以强制执行急切查询。
import com.softwood.domain.*
import org.hibernate.FetchMode
def orgs = OrgRoleInstance.withCriteria {
fetchMode ("sites", FetchMode.SELECT)
sites{}
}
println orgs[0].sites
void "criteria query " () {
given:
OrgRoleInstance org
org = OrgRoleInstance.withCriteria (uniqueResult: true) {
fetchMode ("sites", FetchMode.SELECT)
sites{}
}
expect:
org.id == 3
org.sites.size() == 2
}
groovy.lang.MissingMethodException: No signature of method: grails.gorm.CriteriaBuilder.fetchMode() is applicable for argument types: (java.lang.String, org.hibernate.FetchMode) values: [sites, SELECT]
DomainUnitTest<T>
特性的查询不支持联接/渴望查询等。
最佳答案
该调查的输出是,您不能将单元测试用于试图使用新的单元测试特征联接表的域模型查询。
如果要查询测试,请让作为集成测试来进行。
这次我将查询重新编码为集成测试时,允许在spock setup()方法中的任何数据之前加载引导数据,然后查询开始工作,并且包括对数据的急切查询。
要记住的一件事是setup()方法不会进行回滚(这样数据就可以在整个测试中保留),因此如果数据库没有被删除,则应该在最后进行手动清除。
因此,这没有被编码为集成测试,并且似乎可以正常工作!
package com.softwood.domain
import grails.testing.mixin.integration.Integration
import grails.transaction.*
import org.hibernate.FetchMode
import org.hibernate.LazyInitializationException
import spock.lang.Shared
import spock.lang.Specification
@Integration
@Rollback
class OrgRoleInstanceIntegSpecSpec extends Specification {
//operates on separate transaction thats not rolled back
@Shared
List<OrgRoleInstance> orgs = []
@Shared
List<OrgRoleInstance> sites = []
@Shared
NetworkDomain netDomain
@Shared
def bootstrapPreExistingOrgsCount, bootstrapPreExistingSitesCount
//runs in transaction thats not rolled back for each test
def setup() {
def site
bootstrapPreExistingOrgsCount = OrgRoleInstance.count()
bootstrapPreExistingSitesCount = Site.count()
//println "pre exist orgs:$boostrapPreExistingOrgsCount + pre exist sites: $boostrapPreExistingSitesCount"
assert bootstrapPreExistingOrgsCount == 4
assert bootstrapPreExistingSitesCount == 2
["A","B","C"].each {
OrgRoleInstance org = new OrgRoleInstance(name:"test$it", role:OrgRoleInstance.OrgRoleType.Customer)
org.addToSites(site = new Site( name: "test$it's Head Office", status:"open", org:org))
orgs << org
sites << site
}
orgs[2].addToSites (site = new Site( name: "${orgs[2].name}'s Branch Office", status:"open", org:orgs[2]))
orgs[2].addToDomains(netDomain = new NetworkDomain (name:"corporate WAN", customer:[orgs[2]]))
sites << site
OrgRoleInstance.saveAll(orgs)
assert orgs.size() == 3
assert sites.size() ==4
assert OrgRoleInstance.count() == 3 + bootstrapPreExistingOrgsCount
assert Site.count() == 4 + bootstrapPreExistingSitesCount
assert Site.get(4).org.id == orgs[1].id
println "setup integration test data"
}
//manual cleanup of integration test data
def cleanup() {
orgs.each {OrgRoleInstance org ->
org.sites.each {it.delete()}
org.delete(flush:true)
assert OrgRoleInstance.exists(org.id) == false
}
println "deleted integration test data"
}
void "Orgs list with eager fetch query"() {
given :
def orgs = OrgRoleInstance.list(fetch:[sites:"eager"])
println "org ${orgs[6].name} sites : " + orgs[5].sites
println "test site #2 has org as : " + (Site.list())[3].org
expect :
Site.count() == 4 + bootstrapPreExistingSitesCount
orgs.size() == 3 + bootstrapPreExistingOrgsCount
orgs[5].getName() == "testB"
orgs[5].sites.size() == 1
}
void "orgs where query triggering eager site get"() {
given :
//where clause returns instance of DetachedCriteria, so have to trigger with a list/get etc
def orgs = OrgRoleInstance.where {
name =~ "%testB%" &&
sites{}
}.list()
expect :
orgs.size() == 1
orgs[0].name == "testB"
orgs[0].sites.size() == 1
}
void "withCriteria query with eager site fetch (two selects) " () {
given:
OrgRoleInstance org
//with criteria runs the query for you unlike createCriteria() which returns a detachedCriteria
org = OrgRoleInstance.withCriteria (uniqueResult: true) {
fetchMode ("sites", FetchMode.SELECT)
idEq(7L) //internally wont cast Integer to long, so set it explicitly
sites{}
}
/*def orgs = OrgRoleInstance.withCriteria {
//setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
eq 'name', "B"
//fetchMode 'sites', FetchMode.SELECT
sites{}
}*/
expect:
org.id == 7
org.sites.size() == 2
}
void "detached criteria (with distinct) with eager fetch " () {
given:
def orgs = OrgRoleInstance.createCriteria().listDistinct {
//fetchMode 'sites', FetchMode.SELECT
join 'sites'
sites {
org {
eq 'id', 6L
}
}
}
def site = orgs[0].sites[0]
expect:
orgs.size() == 1
orgs[0].sites.size() == 1
site.name == "testB's Head Office"
}
void "where query on id only without list (fetch eager) " () {
given :
def orgs = OrgRoleInstance.where {
id == 7L
}.list ()
def branch = orgs[0].sites[0]
when:
println "branch "+ branch.name //try and access branch
then:
/*
-- seems to do an eager fetch on sites+domains, even though i didnt ask it to
not quite sure why - separate exploration round that i think
*/
//LazyInitializationException ex = thrown()
orgs.size() == 1
orgs[0].sites.size() == 2
orgs[0].domains.size() == 1
}
}
关于unit-testing - 无法获取查询以进行渴望的一对多关联加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54325664/
我想要显示正在加载的 .gif,直到所有内容都已加载,包括嵌入的 iframe。但是,目前加载 gif 会在除 iframe 之外的所有内容都已加载后消失。我怎样才能让它等到 iframe 也加载完毕
首先,这是我第一次接触 Angular。 我想要实现的是,我有一个通知列表,我必须以某种方式限制 limitTo,因此元素被限制为三个,在我单击按钮后,其余的应该加载。 我不明白该怎么做: 设置“ V
我正在尝试在我的设备上运行这个非常简单的应用程序(使用 map API V2),并且出于某种原因尝试使用 MapView 时: 使用 java 文件: public class MainMap e
我正在使用 Python 2.6、Excel 2007 Professional 和最新版本的 PyXLL。在 PyXLL 中加载具有 import scipy 抛出异常,模块未加载。有没有人能够在
我想做这个: 创建并打包原始游戏。然后我想根据原始游戏中的蓝图创建具有新网格/声音/动画和蓝图的其他 PAK 文件。原始游戏不应该知道有关其他网格/动画/等的任何信息。因此,我需要在原始游戏中使用 A
**摘要:**在java项目中经常会使用到配置文件,这里就介绍几种加载配置文件的方法。 本文分享自华为云社区《【Java】读取/加载 properties配置文件的几种方法》,作者:Copy工程师。
在 Groovy 脚本中是否可以执行条件导入语句? if (test){ import this.package.class } else { import that.package.
我正在使用 NVidia 视觉分析器(来自 CUDA 5.0 beta 版本的基于 eclipse 的版本)和 Fermi 板,我不了解其中两个性能指标: 全局加载/存储效率表示实际内存事务数与请求事
有没有办法在通过 routeProvider 加载特定 View 时清除 Angular JS 存储的历史记录? ? 我正在使用 Angular 创建一个公共(public)安装,并且历史会积累很多,
使用 Xcode 4.2,在我的应用程序中, View 加载由 segue 事件触发。 在 View Controller 中首先调用什么方法? -(void) viewWillAppear:(BOO
我在某些Django模型中使用JSONField,并希望将此数据从Oracle迁移到Postgres。 到目前为止,当使用Django的dumpdata和loaddata命令时,我仍然没有运气来保持J
创建 Nib 时,我需要创建两种类型:WindowNib 或 ViewNib。我看到的区别是,窗口 Nib 有一个窗口和一个 View 。 如何将 View Nib 加载到另一个窗口中?我是否必须创建
我想将多个env.variables转换为静态结构。 我可以手动进行: Env { is_development: env::var("IS_DEVELOPMENT")
正如我从一个测试用例中看到的:https://godbolt.org/z/K477q1 生成的程序集加载/存储原子松弛与普通变量相同:ldr 和 str 那么,宽松的原子变量和普通变量之间有什么区别吗
我有一个重定向到外部网站的按钮/链接,但是外部网站需要一些时间来加载。所以我想添加一个加载屏幕,以便外部页面在显示之前完全加载。我无法控制外部网站,并且外部网站具有同源策略,因此我无法在 iFrame
我正在尝试为我的应用程序开发一个Dockerfile,该文件在初始化后加载大量环境变量。不知何故,当我稍后执行以下命令时,这些变量是不可用的: docker exec -it container_na
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我刚刚遇到一个问题,我有一个带有一些不同选项的选择标签。 现在我想检查用户选择了哪些选项。 然后我想将一个新的 html 文件加载到该网站(取决于用户选中的选项)宽度 javascript,我该怎么做
我知道两种保存/加载应用程序设置的方法: 使用PersistentStore 使用文件系统(存储,因为 SDCard 是可选的) 我想知道您使用应用程序设置的做法是什么? 使用 PersistentS
我开始使用 Vulkan 时偶然发现了我的第一个问题。尝试创建调试报告回调时(验证层和调试扩展在我的英特尔 hd vulkan 驱动程序上可用,至少它是这么说的),它没有告诉我 vkCreateDeb
我是一名优秀的程序员,十分优秀!