我有一个域模型-组织中有很多站点,并且有很多域(这是两个“袋”收集属性)。
我想编写一个查询,一次检索一次,最好检索网站和域集合。
我首先尝试了
org = Org.findById (id, [fetch:[sites:"eager", domains:"eager"]]
失败
无法同时获取多个文件包:[com.softwood.domain.OrgRoleInstance.sites,com.softwood.domain.OrgRoleInstance.domains]
(仅适用于两个集合之一)。
我尝试了这样的条件查询
org = resource.withCriteria (uniqueResult: true) {
fetchMode 'sites', FetchMode.SELECT
fetchMode 'domains', FetchMode.SELECT
idEq(id)
sites {
org {
eq 'id', "$id"
}
}
} // didn't work
哪个错误
没有方法签名:com.softwood.controller.OrgRoleInstanceController.fetchMode()适用于参数类型:(java.lang.String,org.hibernate.annotations.FetchMode)值:[sites,SELECT]
这表明它不喜欢fetchMode函数(使用SELECT或JOIN)。
您如何编写标准查询以按ID返回单个匹配的对象,但同时返回网站和域集合?
域类看起来像这样。我不想使用静态映射= {}闭包-因为我想通过根据需要编写显式查询来控制加载
class Org {
enum OrgRoleType {
Supplier,
Customer,
Service_Provider,
Manufacturer,
Maintainer,
Indeterminate
}
String name
OrgRoleType role
Collection<NetworkDomain> domains = []
Collection<Site> sites = []
Collection<MaintenanceAgreement> mags //optional only set if role is service provider
//Collection<Device> ci
static hasMany = [domains : NetworkDomain, sites: Site, mags:MaintenanceAgreement]
static mappedBy = [mags: "maintainer"] //disambiguate column in mags
static constraints = {
name nullable:false
role nullable:true
domains nullable:true
sites nullable:true
mags nullable:true //optional
}
}
我见过这个[Grails GORM Criteria Query Eager Fetching
我试图做类似的事情,但是fetchMode(字符串,枚举)将不会运行。
我将查询更改为此
org = resource.withCriteria (uniqueResult: true) {
join 'sites'
join 'domains'
idEq(id)
sites {
org {
eq 'id', "$id"
}
}
domains {
customer {
eq 'id', "$id"
}
}
}
此错误
Cannot invoke method call() on null object
带有跟踪点,以指向标准中访问站点{org {的位置。
答案 0 :(得分:0)
因此,第一个测试必须作为集成测试而不是单元测试完成,但是结果是您仍然无法在两个急切的负载下进行查询查找。如果要加载集合,则必须使用条件或where子句进行加载
这里有两个集成测试-第一个使用查找器失败,出现异常,第二个使用条件查询实现目标
void "query by finderById with multiple eager fetch in map conditions " () {
given :
when: "we print value from a collection "
def org = OrgRoleInstance.findById (7L, [fetch:[sites:"eager", domains:"eager"]])
println org.domains[0].name
then:
org.hibernate.loader.MultipleBagFetchException ex = thrown()
}
void "query withCriteria to do multiple eager fetch in map conditions " () {
given :
def org = OrgRoleInstance.withCriteria (uniqueResult: true) {
fetchMode 'sites', FetchMode.SELECT
fetchMode 'domains', FetchMode.SELECT
idEq (7L)
sites {}
domains {}
}
when: "we print value from a collection "
println org.domains[0].name
then:
org.domains.size() == 1
org.sites.size() == 2
}