在Excel模型的外键关键对象上标注ref-connection,这样生成的一对多关联属性上会生成connection标签,并自动生成对应的Connection属性。 例如NopAuthResource的site属性上标注ref-connection,则会自动在NopAuthSite对象的resources属性上增加connection标签。
通过元编程机制会在编译期为meta文件增加对应的Connection属性,例如resourcesConnection。在_dump
目录下可以看到最后生成的属性定义
<meta>
<props>
<prop name="resources" displayName="资源列表" i18n-en:displayName="Resources" tagSet="pub,connection"
ext:kind="to-many" internal="true" ext:joinLeftProp="siteId" ext:joinRightProp="siteId"
ext:joinRightDisplayProp="displayName" insertable="false" updatable="false" lazy="true">
<schema type="io.nop.orm.IOrmEntitySet<io.nop.auth.dao.entity.NopAuthResource>"
bizObjName="NopAuthResource"/>
</prop>
<!--LOC:[90:22:0:0]/nop/core/xlib/biz-gen.xlib#/_delta/default/nop/auth/model/NopAuthSite/NopAuthSite.xmeta-->
<prop name="resourcesConnection" displayName="资源列表" internal="true"
graphql:connectionProp="resources" graphql:queryMethod="findConnection">
<schema type="io.nop.api.core.beans.graphql.GraphQLConnection<io.nop.auth.dao.entity.NopAuthResource>"
bizObjName="NopAuthResource"/>
</prop>
</props>
</meta>
生成的resourcesConnection节点上通过graphql:connectionProp属性引用实体上的一个一对多关联属性,会自动使用这个关联属性对应的关联条件进行过滤。
具体测试用例可以参见 TestConnectionProp
resourcesConnection可以接收的参数为GraphQLConnectionInput类型
public class GraphQLConnectionInput {
/**
* first表示从afterCursor开始向后取n条数据
*/
int first;
int last;
String after;
String before;
/**
* 如果没有设置cursor,则也可以使用offset/limit机制进行分页
*/
long offset;
TreeBean filter;
List<OrderFieldBean> orderBy;
}
返回的结果类型为GraphQLConnection类型
class GraphQLConnection<T> {
long total;
List<GraphQLEdgeBean> edges;
List<T> items;
GraphQLPageInfo pageInfo;
}
class GraphQLPageInfo {
String startCursor;
String endCursor;
Boolean hasNextPage;
Boolean hasPreviousPage;
}
query($filter1:Map, $filter2:Map){
MyObject__get(id:3){
activeRecords: mySubObjectConnection(filter:$filter1,limit:5){
total
items{
id
}
}
inactiveRecords: mySubObjectConnection(filter:$filter2, limit:5){
total
items{
id
}
}
}
}
这里的filter1和filter2是两个不同的查询条件,可以在前端传入不同的查询条件,都是查询同一个子表对象mySubObject
,但是返回的结果是不同的。
/r/MyObject__get?id=3&@selection=activeRecords:mySubObjectConnection,inactiveRecords:mySubObjectConnection
{
"_subArgs.activeRecords.limit": 5,
"_subArgs.activeRecords.filter_status": 1,
"_subArgs.inactiveRecords.limit": 5,
"_subArgs.inactiveRecords.filter_status": 0
}
后台GraphQLWebService接收到_subArgs.
为前缀的参数之后会把它们转换为针对子属性的函数参数,并识别filter_
前缀,将特殊前缀的变量收集在一起,转换为FilterBean对象。
如果在to-one
关联上设置了ref-query
标签,则生成父表到子表的一对多集合属性时,会增加query
标签。在meta-gen.xlib
中,对于具有query标签的一对多属性,
会自动增加graphql:findMethod="findList"
配置,从而为该属性增加分页查询的支持。
<prop name="children" graphql:findMethod="findList">
</prop>
在前台可以传入filter过滤条件和offset/limit分页参数
MyEntity__get(id:3) {
children(filter: {...}, limit:10){
name, status
}
}
在meta的prop节点上,可以配置graphql:maxFetchSize
从而自动限制获取条数为maxFetchSize。如果不指定,则受到全局的maxPageSize的限制。