nebula-contrib / ngbatis

NGBATIS is a database ORM framework base NebulaGraph + spring-boot, which takes advantage of the mybatis’ fashion development, including some de-factor operations in single table and vertex-edge, like mybatis-plus. NGBATIS 是一款针对 NebulaGraph + Springboot 的数据库 ORM 框架。借鉴于 MyBatis 的使用习惯进行开发。https://graph-cn.github.io/ngbatis-docs/
https://nebula-contrib.github.io/ngbatis/
Apache License 2.0
132 stars 42 forks source link

XML文件里面支持<if> <foreach>这种语法吗 #121

Closed ZhangJinzhaoGit closed 1 year ago

ZhangJinzhaoGit commented 1 year ago

如题,谢谢!

CorvusYe commented 1 year ago

Hi @ZhangJinzhaoGit 支持类似的语法,形式上不太一样,可以参考:

ZhangJinzhaoGit commented 1 year ago

两个问题问一下:

  1. image

这种好像不支持吗?

ZhangJinzhaoGit commented 1 year ago
  1. 在返回对象里我用String接受一个id好像会报错?不能用字符型来接受数字吗?
ZhangJinzhaoGit commented 1 year ago

谢谢!

CorvusYe commented 1 year ago

两个问题问一下: 1. image

这种好像不支持吗?

如果tagQuery在 dao 中使用了 @Param("tagQuery")可以试试:where id in $tagQuery.idList

CorvusYe commented 1 year ago
  1. 在返回对象里我用String接受一个id好像会报错?不能用字符型来接受数字吗?

类型的限定会比较严格,目前不支持用String来接收数字类型的值

ZhangJinzhaoGit commented 1 year ago

我想在if里面判断一个数组的长度大于0或者不为空可以吗

CorvusYe commented 1 year ago

如果Dao实现了 NebulaDaoBasic 接口,可以直接调用 dao.selectByIds( idList ) 不需要再编写 xml 内部xml的实现如下:

    <select id="selectByIds">
        match (n: `${ ng.tagName( ng_args[0], ng_cm ) }`)
        where id(n) in [ ${ ng.join( @ids, ", ", "ng.valueFmt" ) } ]
        return n
    </select>
CorvusYe commented 1 year ago

我想在if里面判断一个数组的长度大于0或者不为空可以吗

可以的:

 @if (isNotEmpty(tagQuery.idList) ) {
    <!-- 不为空时需要实现的内容 -->
 @}
CorvusYe commented 1 year ago

可以在 yml 当中添加:

logging:
  level:
    org.nebula.contrib: DEBUG
ZhangJinzhaoGit commented 1 year ago

where id in $tagQuery.idList 我使用上面这种好像并没有生效 image

ZhangJinzhaoGit commented 1 year ago

然后我换成 where id(n) in [ ${ ng.join( @ids, ", ", "ng.valueFmt" ) } ] 这样,好像会报错无此属性 image

CorvusYe commented 1 year ago

方便贴一下 Dao 方法的声明吗

ZhangJinzhaoGit commented 1 year ago

image

ZhangJinzhaoGit commented 1 year ago

image

ZhangJinzhaoGit commented 1 year ago

还有 ng.join 这个方法只能对String的数组使用吗,对Long的数组可以使用吗?谢谢!

CorvusYe commented 1 year ago

ng.join List<Long>List<String> 都可以使用 不好意思,刚刚这里写错了,tagQuery 前面需要用 @ 符来标记是个 java 对象

  @if ( isNotEmpty( @tagQuery.idList) ) {
    <!-- 不为空时需要实现的内容 -->
  @}
ZhangJinzhaoGit commented 1 year ago

image 我发现不加@是好的,加了就会报错,说找不到这个。。

然后ng.join我在使用的时候,如果是List<Long>会报错 image

CorvusYe commented 1 year ago

然后ng.join我在使用的时候,如果是List<Long>会报错 image

如果是数字可以把 ng.join 的第三个参数 "ng.valueFmt" 去掉

ZhangJinzhaoGit commented 1 year ago

可以了,感谢,最后一个问题问一下 MATCH p=(v:tag01) -[e:edge01*1..1]-(v2:tag01) 我想里面的某一个值是变量,支持吗 MATCH p=(v:tag01) -[e:edge01*1..$tagQuery.length]-(v2:tag01) 这样会报语法错误 image

CorvusYe commented 1 year ago

可以用:MATCH p=(v:tag01) -[e:edge01*1..${tagQuery.~size}]-(v2:tag01) 或者:MATCH p=(v:tag01) -[e:edge01*1..${@tagQuery.size()}]-(v2:tag01)

ZhangJinzhaoGit commented 1 year ago

可以用:MATCH p=(v:tag01) -[e:edge01*1..${tagQuery.~size}]-(v2:tag01) 或者:MATCH p=(v:tag01) -[e:edge01*1..${@tagQuery.size()}]-(v2:tag01)

length是tagQuery这个类的一个成员变量

CorvusYe commented 1 year ago

哦哦,大意了 MATCH p=(v:tag01) -[e:edge01*1..${tagQuery.length}]-(v2:tag01)

${ 变量名 } 是执行到数据库前读取的, $变量名 是执行到数据库后,由数据库获取的 如果 nebula 的多跳能支持参数的方式,上面的语句可以用 $tagQuery.length 来替代

ZhangJinzhaoGit commented 1 year ago

可以了,感谢!

CorvusYe commented 1 year ago

ng.join 的方法签名:

   public String call(Iterable<?> iterable, String sep, String fnName)

按理List<Long>也应该支持 ng.valueFmt,也感谢你帮忙发现了一个 ng.join 的 bug。