假设我有一个包含User
字段的域对象Organization
。我可以使用外键映射它,让hibernate像这样处理剩下的事情:
class User {
String id
String firstName
Organization organization
static mapping = {
table 'user'
id column: "user_id", generator:'assigned'
organization column: 'organization_Id'
}
}
class Organization {
String id
String name
String address
static mapping = {
table 'organization'
id column: "organization_id", generator:'assigned'
}
}
这很好用,但是当我想查询组织中的所有用户时,我可能需要做这样的事情
String orgId = "some id"
Organization org = Organization.findById(orgId)
List<User> users = User.findAllByOrganization(org)
不必传递Organization
域对象,而只是传递Organization.Id,这是User
表上的外键。
我希望我的代码看起来如下:
String orgId = "some id"
List<User> users = User.findAllByOrganization(orgId)
经过研究,似乎这是不可能的,我需要首先查询Organization
,然后使用该对象。有没有我不知道的方式?
答案 0 :(得分:3)
我喜欢这样做的一种方法是使用域对象的代理而不是它的水合实例。您可以使用load()
获取代理。这意味着只要您不访问id
之外的任何域对象属性,就不会进行数据库调用。
def users = Users.findByOrganization(Organization.load(orgId))
答案 1 :(得分:1)
您可以使用Criteria
:
String orgId = "some id"
List<User> users = User.createCriteria().list {
organization {
idEq(orgId)
}
}
答案 2 :(得分:1)
您有两种选择:
orgId
类添加一个冗余的User
字段并将其用于。{
查找。
Organization org = new Organization()
org.id = 'someId' // looks strange, but you can not use id inside constructor
def users = Users.findAllByOrganization org