我正在使用Grails中的Hibernate,并且已正确设置Parent
域类和Child
域类,已完全配置,具有静态hasMany
和belongsTo
属性。我们只为这个场景使用类名Parent
和Child
,但它也可以应用于其他场景,实用性。
为了测试这种映射,我还执行了许多成功的CRUD。虽然过了一段时间,但会出现提前查询。我目前只是在执行一些“提前”查询,我在下面总结了这些查询。使用给定的Domain
映射:
class Parent {
Long id
static hasMany = [ children: Child ]
}
class Child {
Long id
static belongsTo = [ parent: Parent ]
}
如何选择以下标准:
as JSON
groovy类型转换转换为JSON时才应包含男孩)我不知道如何开始编码1和2,也许与child.size()
有关 - 我真的不知道。虽然我在3中的想法是:
ArrayList<Parent> PARENTS_WITH_SON = Parent.createCriteria().list {
children {
eq("gender", "male")
}
}
但问题是当转换为JSON时,它包含非男性条目。有人可以帮我查询吗?使用createCriteria()
会很好,但它也可以在HQL
。
答案 0 :(得分:2)
1&amp; 2真的很容易:
<强> 1。选择所有没有孩子的父母
Parent.createCriteria().list {
sizeEq("children", 0)
}
<强> 2。选择所有带孩子的父母
Parent.createCriteria().list {
sizeGt("children", 0)
}
第3。选择所有带有男孩的父母(因此,当通过JSON groovy类型转换转换为JSON时,应该只包括男孩子)
Parent.createCriteria().listDistinct {
children {
eq("gender", "male")
}
}
使用上述查询,您将获得有男性孩子的父母的集合。但是当你进行直接的JSON转换时,GORM将获取所有父级的子级。因此,您可以编写自定义JSON转换器,也可以修改查询以仅返回Map中的所需数据。
/*
create a new Grails Criteria that internally will use
Hibernate's org.hibernate.Criteria.
*/
List<Map<String, Object>> resultList = Parent.createCriteria().list {
/*
Set a strategy for handling the query results.
This determines the "shape" of the query result.
See org.hibernate.Criteria.setResultTransformer(...)
CriteriaSpecification.ALIAS_TO_ENTITY_MAP transformer will transform the results into a Map<String, Object>
*/
resultTransformer(org.hibernate.criterion.CriteriaSpecification.ALIAS_TO_ENTITY_MAP)
/*
Join an association using the specified join-type,
assigning an alias to the joined association.
org.hibernate.Criteria.createAlias(...)
*/
createAlias("children", "child", JoinType.INNER_JOIN);
projections {
property("id", "parentId")
property("child.id", "childId")
property("child.gender", "gender")
}
eq("child.gender", "MALE")
}
这将为您提供一个包含parentId,childId和gender作为其键的Map列表。 Json就是:
[
{
"childId": 1,
"gender": "MALE",
"parentId": 2
},
{
"childId": 3,
"gender": "MALE",
"parentId": 2
},
{
"childId": 4,
"gender": "MALE",
"parentId": 3
},
{
"childId": 5,
"gender": "MALE",
"parentId": 3
}
]