我使用jdbi3和StringTemplate 4模板引擎,我有以下测试查询:
@SqlQuery("select * from test "
+ "where field1 = 5"
+ "<if(cond1)> or field2 \\<= :value1<endif>"
+ "<if(cond2)> or field2 >= :value2<endif>"
+ "<if(cond3)> or field2 in (<values>)<endif>")
@RegisterBeanMapper(Test.class)
@UseStringTemplateEngine
public List<Test> selectTest(
@Define("cond1") boolean cond1, @Bind("value1") int value2,
@Define("cond2") boolean cond2, @Bind("value2") int value3,
@Define("cond3") boolean cond3,
@BindList(value="values", onEmpty=BindList.EmptyHandling.NULL_STRING ) List<Integer> values);使用StringTemplate引擎时,我必须用\转义查询中的字符<或>?通过测试,我发现我必须像以前一样在查询中转义<=。
在使用@BindList的In子句中,我必须使用<values>,但在本例中,我希望像\\<values>一样转义它,否则它将被StringTemplate用作属性,但是如果我这样做,查询就不能工作。
关于>=是否转义,在查询中似乎是一样的。
发布于 2022-04-20 11:24:43
引言
让我们考虑:
3.27.1 Jdbi版本作为当前的Jdbi版本。4.3.1 StringTemplate版本作为当前的StringTemplate版本,因为当前的Jdbi版本使用它。请看:v3.27.1·jdbi/jdbi /jdbi。回答
Jdbi
文档:要转义的字符
请注意要转义的字符的警告:
由于StringTemplate默认使用
<字符标记ST表达式,因此可能需要转义一些SQL:String datePredSql = "<if(datePredicate)> <dateColumn> \\< :dateFilter <endif>"。 - jdbi/index.adoc v3.27.1·jdbi/jdbi。
单元测试:不要转义@BindList变量名
请参阅BindListTest.ifValueGivenWithNullValueOptionThenResultIsTruthy()测试方法:jdbi/BindListTest.java v3.27.1·jdbi/jdbi。
请注意,测试涵盖了一个非常类似的注释方法:
@SqlQuery("select name from something <if(name)> where name in (<name>) <endif>")
@UseStringTemplateEngine
List<String> getForValue(@Nonnull @BindList(value = "name", onEmpty = NULL_VALUE) List<String> name);请注意,@BindList变量名没有转义:
in (<name>)StringTemplate
文档:要转义的字符
请注意要转义的字符:
模板是文本和表达式元素的序列,可选地加上注释。在最粗糙的层面上,基本要素是: 文本<!评论!> 带有反斜杠字符的转义分隔符:
\<或\>。 - ·为4.3.1·antlr/stringtemplate4 4。
https://stackoverflow.com/questions/59236448
复制相似问题