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

参数循环问题 #159

Closed zhangxk-ocean closed 1 year ago

zhangxk-ocean commented 1 year ago

@for 怎么实现循环之间加一个逗号呢 类似这种:(), (), ()

CorvusYe commented 1 year ago

有个ng.join的函数可以用

zhangxk-ocean commented 1 year ago

可以这个举个例子吗,不会用欸 @for ( entry in p ) { @if ( isNotEmpty( entry.value ) ) { AND n.person.${ entry.key } == $p.${ entry.key } @} @}

CorvusYe commented 1 year ago

可以看看这个https://graph-cn.github.io/ngbatis-docs/dev-example/built-in-function.html

CorvusYe commented 1 year ago

https://github.com/nebula-contrib/ngbatis/blob/master/src/main/java/org/nebula/contrib/ngbatis/binding/beetl/functions/JoinFn.java

看一下函数对应的java方法签名这部分的使用可能就会好理解一点

CorvusYe commented 1 year ago

可以这个举个例子吗,不会用欸 @for ( entry in p ) { @if ( isNotEmpty( entry.value ) ) { AND n.person.${ entry.key } == p.{ entry.key } @} @}

dao.java

  List<Person> selectByPerson(@Param("p") Person a);
    <select id="selectByPerson" resultType="ye.weicheng.ngbatis.demo.pojo.Person">
        MATCH (n: person)
        WHERE 1 == 1
        @for ( entry in p ) {
            @if ( isNotEmpty( entry.value ) ) {
                AND n.person.${ entry.key } == $p.${ entry.key }
            @}
        @}
        RETURN n
    </select>

test.java

    Person p = new Person();
    p.setName("叶小南");
    p.setAge(18);
    List<Person> persons = repository.selectByPerson(p);

最终执行的效果等价于:

:param p => {"name":"叶小南","age":18};

MATCH (n: person)
WHERE 1 == 1 
  AND n.person.name == $p.name
  AND n.person.age == $p.age
RETURN n

不同位置的 p 虽然都代表传入的参数,但是意义不同: image

两个$符号的意义也不同,

在这个例子中,$p.${ entry.key } 的最终结果是 $p.name 共同组成 nGQL 语法的一部分,执行到数据库中。

如果参数是 Map,这么用就很合适,但如果是实体类做参数,可以考虑使用 基类的 selectBySelective https://github.com/nebula-contrib/ngbatis/blob/master/src/main/resources/NebulaDaoBasic.xml 基类的实现方式,跟日常开发编写的 xml 几乎是一致的,这里的用法,日常开发也都能用

如果有其他想固化下来的基类操作,欢迎来提 PR。 顺带提下,也可以来给文档PR一下 SpringCloud 的配置例子