在Parent上执行createCriteria(),其中计算Child及其属性

时间:2016-05-31 12:08:20

标签: json hibernate grails groovy

我正在使用Grails中的Hibernate,并且已正确设置Parent域类和Child域类,已完全配置,具有静态hasManybelongsTo属性。我们只为这个场景使用类名ParentChild,但它也可以应用于其他场景,实用性。

为了测试这种映射,我还执行了许多成功的CRUD。虽然过了一段时间,但会出现提前查询。我目前只是在执行一些“提前”查询,我在下面总结了这些查询。使用给定的Domain映射:

class Parent {
    Long id
    static hasMany = [ children: Child ]
}

class Child {
    Long id
    static belongsTo = [ parent: Parent ]
}

如何选择以下标准:

  1. 选择所有没有孩子的父母
  2. 选择所有带孩子的父母
  3. 选择所有带有男孩的父母(因此,只有在通过as JSON groovy类型转换转换为JSON时才应包含男孩)
  4. 我不知道如何开始编码1和2,也许与child.size()有关 - 我真的不知道。虽然我在3中的想法是:

    ArrayList<Parent> PARENTS_WITH_SON = Parent.createCriteria().list {
        children {
            eq("gender", "male")
        }
    }
    

    但问题是当转换为JSON时,它包含非男性条目。有人可以帮我查询吗?使用createCriteria()会很好,但它也可以在HQL

1 个答案:

答案 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
  }
]