enjoy模板sql语句问题

or语句不知道在模板中这样写有什么问题

SELECT
 a.id,
 a.title
FROM
 user a
WHERE
  #if(t0 != null)
   a.tag like '%#(t0)%'
  #end
  OR
  #if(t1 != null)
   a.tag like '%#(t1)%'
  #end
  order by a.see desc
  limit 8

提示错误:

Caused by: com.alibaba.druid.sql.parser.ParserException: ERROR. token : OR, pos : 49
	at com.alibaba.druid.sql.parser.SQLExprParser.primary(SQLExprParser.java:600)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser.primary(MySqlExprParser.java:172)
	at com.alibaba.druid.sql.parser.SQLExprParser.expr(SQLExprParser.java:85)
	at com.alibaba.druid.sql.parser.SQLSelectParser.expr(SQLSelectParser.java:540)
	at com.alibaba.druid.sql.parser.SQLSelectParser.parseWhere(SQLSelectParser.java:260)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlSelectParser.query(MySqlSelectParser.java:159)
	at com.alibaba.druid.sql.parser.SQLSelectParser.select(SQLSelectParser.java:59)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser.parseSelect(MySqlStatementParser.java:199)
	at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:114)
	at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:79)
	at com.alibaba.druid.wall.WallProvider.checkInternal(WallProvider.java:620)
	at com.alibaba.druid.wall.WallProvider.check(WallProvider.java:574)
	at com.alibaba.druid.wall.WallFilter.check(WallFilter.java:712)
	... 49 more

谢谢~

评论区

JFinal

2018-12-06 23:28

#if 中的表达式如果是 false ,自然就有问题,改成下面的形式:

#set( flag = false)
SELECT
a.id,
a.title
FROM
user a
WHERE
#if(t0 != null)
a.tag like '%#(t0)%'
#set(flag = true)
#end
#if(t1 != null)
#(flag ? "OR", "")
a.tag like '%#(t1)%'
#end
order by a.see desc
limit 8


也就是说用一个变量 flag 来表达前一个 #if 是否已经进入过了,才决定后面的 #if 中是否要生成一个 "OR" 出来

其实单步调试看看 getSqlPara 出来得到的 sql 值是什么就能知道问题出在哪里

过河

2018-12-08 22:04

@JFinal 好的 谢谢波总 已经解决了