Anorm查询中如何使用'like'?

How to use 'like' in Anorm query?

我的数据库是 porstgres,我正在尝试编写一个将使用 like 或 ~(postgres 正则表达式)的查询。 我无法使用 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.*)

有没有更好的方法来实现这个?

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

我的意思是 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.*)

当使用 .on 传递字符串值的 ... '{param}' 时,JDBC 语句准备为 ... ''$strVal'',因为值根据 [=26] 进行了转义=].

所以应该从 SQL 语句中删除单引号,并且 % 必须是转义字符串值的一部分。

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

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

如果要使用插值,最好使用Anorm one

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