如何使用'喜欢'在Anorm查询?

时间:2016-03-14 00:05:07

标签: scala anorm

我的数据库是porstgres,我正在尝试编写一个使用like或〜(postgres regex)的查询。 我无法使用on。

编写此查询

所以这就是我试着写的:

SQL(s"""SELECT id, name
       |FROM my_table 
       |WHERE name ~ '^{name}'""")
.on('name -> name).as(parser.*)

或者:

SQL(s"""SELECT id, name
       |FROM my_table 
       |WHERE name like '{name}%'""")
.on('name -> name).as(parser.*)

为我工作的代码不使用。 它看起来像这样:

SQL(s"""SELECT id, name
       |FROM my_table 
       |WHERE name """.concat(s"like '$name%'").as(parser.*)

有没有更好的方法来实现这一目标?

2 个答案:

答案 0 :(得分:4)

... '{param}'使用.on传递字符串值时,JDBC语句准备为... ''$strVal'',因为该值是根据JDBC转义的。

因此,应从SQL语句中删除单引号,而%必须是转义字符串值的一部分。

SQL("""SELECT id, name
   |FROM my_table 
   |WHERE name like {name}""")
  .on('name -> s"{name}%").as(parser.*)

此外,字符串插值是无用的(SQL(s"...")应该是SQL("...")),因为Anorm占位符不是使用它准备的。

如果你想使用插值,最好使用Anorm。

SQL"""SELECT id, name
   |FROM my_table 
   |WHERE name like ${name + "%"}""".
  as(parser.*)

答案 1 :(得分:1)

我认为问题在于您尝试将参数传递给字符串内部。

我的意思是代替WHERE name like '{name}%'它应该只是WHERE name like {name}

SQL(s"""SELECT id, name
       |FROM my_table 
       |WHERE name like {name}""")
.on('name -> "foo%").as(parser.*)