ngbatis icon indicating copy to clipboard operation
ngbatis copied to clipboard

how to get properties of all TAGs

Open zhangxk-ocean opened this issue 2 years ago • 16 comments

gql语句:match(n) return n limit 10 xml中指定的类是HashMap 返回结果的格式如下: image 1、我是想将不同点的数据处理一下,返回给前端的类中包含3个属性:id、tagNames、attributeMap,但如果返回的类不统一的话,就没有办法去处理,就会报错(例如:cup.modules.ngbatis.entity.Person cannot be cast to com.vesoft.nebula.client.graph.data.Node)
2、我发现原因是,我创建了Tag为person的对应的实体类Person,用@Table("person")声明;而xml返回结果会匹配@Table("")对应的tag,如果相同,就会自动用该@Table声明的实体类,然后其余不匹配的就会使用Node类,因此返回结果会出现Person类和Node都有。
3、请问应该怎么将这个匹配规则关闭呢

zhangxk-ocean avatar May 10 '23 07:05 zhangxk-ocean

我试了下xml指定类为Node,结果报异常,看来是解决不了,宣告这种方法也失败了。 异常如下: image

zhangxk-ocean avatar May 10 '23 07:05 zhangxk-ocean

    ResultSetUtil.if_unknown_relation_to_map = true;
    ResultSetUtil.if_unknown_node_to_map = true;

可以看看这个未知类型自动转换成 map 的方式是否满足需求

CorvusYe avatar May 10 '23 07:05 CorvusYe

在不是所有tag都定义了实体类的情况下,泛型的处理上是有点问题,还是会存在一些是实体,一些是map的情况。

CorvusYe avatar May 10 '23 07:05 CorvusYe

    ResultSetUtil.if_unknown_relation_to_map = true;
    ResultSetUtil.if_unknown_node_to_map = true;

可以看看这个未知类型自动转换成 map 的方式是否满足需求

这个怎么用呢

zhangxk-ocean avatar May 10 '23 07:05 zhangxk-ocean

这个是全局的设置,直接在 Springboot 主函数中设置就行。

CorvusYe avatar May 10 '23 07:05 CorvusYe

还有个问题想请教一下,怎么实现随机返回10条数据呢,我用limit 10的话,每次返回的数据都是一样的,无法随机

zhangxk-ocean avatar May 10 '23 08:05 zhangxk-ocean

试试加一个随机数的列,通过这个列排序? 不过不确定nebula支不支持这种方式

CorvusYe avatar May 10 '23 08:05 CorvusYe

使用这个设置后,返回的结构就去全是LinkedHashMap了,结构如下: image

这边是把实体类去掉了吗? 如果项目是动态的,是不需要定义实体类, 但如果不是动态的,还是建议把实体类都建上,可以规避项目中期追加实体类影响到原有结构的情况。

CorvusYe avatar May 10 '23 08:05 CorvusYe

刚才请求错接口了,使用这个设置后,还是会存在一些是实体,一些是map的情况。 image

zhangxk-ocean avatar May 10 '23 08:05 zhangxk-ocean

使用这个设置后,返回的结构就去全是LinkedHashMap了,结构如下: image

这边是把实体类去掉了吗? 如果项目是动态的,是不需要定义实体类, 但如果不是动态的,还是建议把实体类都建上,可以规避项目中期追加实体类影响到原有结构的情况。

我们这是动态的也有,静态的也有,就是会有几个固定的tag需要创建实体类,需要加上,其余的就是动态的了

zhangxk-ocean avatar May 10 '23 08:05 zhangxk-ocean

那应该不会存在现在是动态以后变静态,或者现在是静态以后变动态的情况吧,

如果这种情况存在,慎重一点的话,可能需要自定义一个 ResultHandler 把数据的处理固化下来。 在这个类中将动静的处理固化到项目中。

CorvusYe avatar May 10 '23 08:05 CorvusYe

这种动静的返回的结构应该怎么处理呢,实体类和Node类都有

zhangxk-ocean avatar May 10 '23 08:05 zhangxk-ocean

项目中自定义一个可以兼容动静的实体类,比如说CustomResult 然后再定义一个处理类 extends AbstractResultHandler<Collection, CustomResult> 需要兼容动静的dao方法使用 Collection<CustomResult> 来返回。

CorvusYe avatar May 10 '23 08:05 CorvusYe

明白了,我去试一下

zhangxk-ocean avatar May 10 '23 08:05 zhangxk-ocean

在实现的处理类中,可以拿到原始的 ResultSet,读取原始数据后,由项目来做过滤实现动静分流

CorvusYe avatar May 10 '23 08:05 CorvusYe

@zhangxk-ocean 今天在整理文档,才想起你这个场景最合适的方式是以 NgVertex 的结果返回。 例如:

  List<NgVertex> listVertex();
  <select id="listVertex" resultType="org.nebula.contrib.ngbatis.models.data.NgVertex">
  </select>

不过这个方式具备一定的入侵性。

CorvusYe avatar May 21 '23 11:05 CorvusYe