我在Grails中有一些投影问题。你能帮我复习一下并为我提出解决方案吗?
我想查询许多表上的数据,这些表具有多对一的关系,并在两者上的某些属性上进行投影。例如:
class Person {
int id
String name
String address
static hasMany = [cars : Car]
}
class Car {
int id
String brand
long price
Person owner
static belongsTo = [owner : Person]
}
那么,我如何只使用一个带有标准的查询(应用投影)来获取指定汽车的信息(包括品牌,价格和所有者名称)?是否可以使用:
Car.withCriteria {
projections {
property("brand")
property("price")
property("owner.name")
}
eq("id", carId)
}
我可以使用投影获取一个指定人员的信息以及他所有车辆的名称吗?例如:[01,Perter,01 Street A,[Mercedes,Toyota,Ducatti]]?
特殊情况:(以上人员类)
一个人可以加入许多组织,组织可以有一个“父母”组织(反之亦然,组织可以有许多其他依赖组织)。但是有一个规则:一个人只能加入一个特定组织的一个儿童组织。因此,对于给定的组织O和人P,获得P的信息的最快方式是什么,以及具有P作为成员的O的依赖组织的名称。我更喜欢使用Grails投影。
这是数据模型:
class Person {
int id
String name
String address
static hasMany = [joinedOrgs : Organization]
}
class Organization {
int id
String name
Organization parentOrg
static hasMany = [members : Person, childOrgs : Organization]
}
我是Grails的新手,我想更了解GORM。非常感谢你的帮助。
答案 0 :(得分:9)
试试这个
def results = Car.createCriteria().list() {
createAlias('owner','owner')
projections {
property('owner.name', 'owner.name')
property('brand','brand')
property('price','price')
}
}
答案 1 :(得分:3)
对于(第1号)我认为你在寻找的是
http://grails.1312388.n4.nabble.com/grails-reports-page-multiple-domain-criteria-join-td3510604.html
def criteria = Company.createCriteria()
def results = criteria.list {
projections {
property('id', 'company.id')
...
POCs{
property('id', 'poc.id')
property('name', 'poc.name')
}
software {
productKey {
...
}
}
...
order(company.name,'asc')
}
帖子使用.createCriteria()
答案 2 :(得分:1)
对于(1)和(2),我不知道是否有办法通过一个标准查询来做你想要的东西,但另一种方法似乎更简单和自然。对于(1):
def car = Car.get(carId)
def owners = car.owner?.name
对于(2)
def person = Person.get(personId)
def cars = person.cars*.name
关于(3),这里有一种设计问题。您当前的域设计不反映您描述的规则,因此很难维护该约束。您可以考虑映射PersonOrganization表和make childrenOrganization a transient property。例如:
class Organization {
int id
String name
Organization parent
static transients = ['children']
...
Boolean children() {
def children = Organization.createCriteria().list() {
eq ('parent', this)
}
return children
}
}
之后,您可以使用跟踪功能(如getAllAncestors())来确定组织的所有父级层次结构,并在人员组织列表中查找。这似乎不是最好的方式,但这是一种可能的方式。