对象抓取器
概念
提示
一句话查询任意形状的数据结构,就如同GraphQL 所做的那样
对象抓取器,是Jimmer的一个重要功能,抓取指定的字段,然后组装成对象,这一切是自动完成的,节省了很多手写转换逻辑的时间。
对象抓取器和以下这类技术类似,但更加强大
虽然在查询中返回整个对象的代码很简单,但是默认对象格式往往不能很好地符合开发需求。很容易遇到两个问题
-
over fetch问题
我们不需要的对象属性查询了,形成了浪费,尤其是对象字段很多的时。
以JPA为例,其返回对象默认是一个完整对象,不需要的非关联属性也会包含在内。这是传统ORM一个很大的问题 (JPA的
@Basic(fetch = FetchType.LAZY)
为LOB列设计,不能用在任何列上)。 -
under fetch问题
我们需要的对象属性被并未被获取,处于不可用unloaded状态,程序无法正确运行。
对象抓取器很好地解决这个问题,通过让用户指定要抓取的属性,然后利用动态对象的特性,让查询返回的对象既不over fetch也不under fetch。
利用对象抓取器的可以轻松指定查询的返回格式,因为动态对象可以描述任意形状的数据结构,你可以决定某个业务视角是否需要查询某些实体、关系、甚至每一个属性。
例子
- Java
- Kotlin
信息
和GraphQL比较
- GraphQL基于HTTP服务,该功能只有在跨越HTTP服务的边界才能呈现;而在Jimmer中,这是ORM的基础API,你可以在任何代码逻辑中使用此能力。
- 截止到目前为止,GraphQL协议不支持对深度无限的自关联属性的递归查询;而Jimmer支持。