blinkfox/fenix

foreach里面生成的SQL不能通过占位方式生成SQL而后赋值

johnnyhhj opened this issue · 3 comments

org.mvel2.PropertyAccessException: [Error: could not access: item; in class: java.util.HashMap]
[Near : {... item.id ....}]
^
[Line: 1, Column: 2]
at org.mvel2.PropertyAccessor.getBeanProperty(PropertyAccessor.java:679) ~[mvel2-2.4.8.Final.jar:na]
at org.mvel2.PropertyAccessor.getNormal(PropertyAccessor.java:178) ~[mvel2-2.4.8.Final.jar:na]
at org.mvel2.PropertyAccessor.get(PropertyAccessor.java:145) ~[mvel2-2.4.8.Final.jar:na]
at org.mvel2.PropertyAccessor.get(PropertyAccessor.java:125) ~[mvel2-2.4.8.Final.jar:na]
at org.mvel2.ast.ASTNode.getReducedValue(ASTNode.java:187) ~[mvel2-2.4.8.Final.jar:na]
at org.mvel2.MVELInterpretedRuntime.parseAndExecuteInterpreted(MVELInterpretedRuntime.java:112) ~[mvel2-2.4.8.Final.jar:na]
at org.mvel2.MVELInterpretedRuntime.parse(MVELInterpretedRuntime.java:58) ~[mvel2-2.4.8.Final.jar:na]
at org.mvel2.MVEL.eval(MVEL.java:114) ~[mvel2-2.4.8.Final.jar:na]
at com.blinkfox.fenix.helper.ParseHelper.parseExpressWithException(ParseHelper.java:45) ~[fenix-2.3.6.jar:na]
at com.blinkfox.fenix.core.FenixXmlBuilder.renderSqlAndOtherParams(FenixXmlBuilder.java:159) ~[fenix-2.3.6.jar:na]
at com.blinkfox.fenix.core.FenixXmlBuilder.buildSqlInfo(FenixXmlBuilder.java:132) ~[fenix-2.3.6.jar:na]
at com.blinkfox.fenix.core.FenixXmlBuilder.buildNewSqlInfo(FenixXmlBuilder.java:103) ~[fenix-2.3.6.jar:na]
at com.blinkfox.fenix.core.FenixXmlBuilder.getXmlSqlInfo(FenixXmlBuilder.java:79) ~[fenix-2.3.6.jar:na]
at com.blinkfox.fenix.core.Fenix.getXmlSqlInfo(Fenix.java:104) ~[fenix-2.3.6.jar:na]
at com.blinkfox.fenix.jpa.FenixJpaQuery.getSqlInfoByFenix(FenixJpaQuery.java:295) ~[fenix-2.3.6.jar:na]
at com.blinkfox.fenix.jpa.FenixJpaQuery.doCreateQuery(FenixJpaQuery.java:128) ~[fenix-2.3.6.jar:na]
at com.blinkfox.fenix.jpa.FenixJpaQuery.doCreateQuery(FenixJpaQuery.java:110) ~[fenix-2.3.6.jar:na]
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.createQuery(AbstractJpaQuery.java:227) ~[spring-data-jpa-2.4.1.jar:2.4.1]

    <fenix id="insertBlogs">
        INSERT INTO test.t_blog (c_id, c_title, c_content)
        VALUES
        @foreach{item : blogs}
            ( #{ item.id }, #{ item.title }, #{ item.content } )
        @end{','}
    </fenix>
    @Modifying
    @QueryFenix(nativeQuery = true)
    void insertBlogs(@Param("blogs") List<Blog> blogs);

Fenix 中的 #{} 是编译期间替换的,MVEL 模板引擎是识别不了 #{} 的,你把 #{} 换成 @{} 才行。但是,这样也不是占位符形式的。目前是暂时无法实现 @foreach 方式的占位符形式参数了,因为无法在 MVEL 运行期间去替换字符串数据。

JPA 的批量保存直接调用 saveAll 就行了吧,不需要使用这种 MyBatis 里面的原生写法。

大家可以用 2.4.0 版本,Fenix 中新增的更高效的批量增删改的几个方法哈,效率上相比之前的 saveAll 有很大幅度的提升。