繁体   English   中英

如何在SQL中将单个子字符串与字符串匹配?

[英]How to match individual substring to a String in Sql?

我在主类中使用实体管理器调用命名查询,如下所示

this.list = em.createNamedQuery(MyClass.Check_Name).setParameter("name", NAMES).getResultList();

命名查询如下

@NamedQueries({
@NamedQuery(name = MyClass.Check_Name, query = "SELECT sc FROM sampleTable sc  where sc.name IN :name")})

我正在传递包含字符串值('A','B','C')的NAMES

现在我面临的问题是表中的sc.name列由各个值组成,例如“ A”,“ B”,“ C”,但我正在将查询中的整个sc.name列与NAMES变量进行比较。因此它返回)结果列表。

如何将单个子字符串与字符串匹配?

对于某些用法,JDBC具有SQL ARRAY的Array类,例如createArrayOf

Array array = connection.createArrayOf("VARCHAR", new Object[] {"A", "B", "C" });
preparedStatement.setArray("name", array);

List (或任何Collection )传递给setParameter方法。

query.setParameter("name",list)

休眠专门执行检查实例收集

 public TypedQuery<X> setParameter(String name, Object value) {
    try {
      if(value instanceof Collection) {
        this.query.setParameterList(name, (Collection)value);
      } else {
        this.query.setParameter(name, value);
      }

      this.registerParameterBinding(this.getParameter(name), value);
      return this;
    } catch (QueryParameterException var4) {
      throw new IllegalArgumentException(var4);
    } catch (HibernateException var5) {
      throw this.getEntityManager().convert(var5);
    }
  }

其他JPA实现可能具有相同的行为

如果您坚持使用名称类型为“ A,B,C”的字符串,则可以看到2个选项:1)每次都构建sql,没有参数

query = "SELECT sc FROM sampleTable sc  where sc.name IN (" + NAMES + ")"

如果NAMES来自用户输入,则需要进行sql注入。

2)带参数的sql injection safe选项,但性能可能较慢,优化器无法使用索引

query = "SELECT sc FROM sampleTable sc where ',' || :name || ',' like '%,' || sc.name || ',%'" 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM