如何在Sql中将单个子串匹配到一个字符串?

问题描述:

我打电话我的主类使用实体管理器命名查询,如下如何在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')

现在我面对的问题是表中的sc.name列由单个值组成的“A”,“B”,“C”但我将查询中的列sc.name作为整体与NAMES变量进行比较,从而返回结果列表。

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

+2

需要构建使用'查询字符串:NAME'。 SQL不接受列表作为单个参数。 –

+0

NAMES变量中的参数个数不固定。那么我们可以构造这样的SQL查询吗? – DharmasriS

+0

使用像'where','+:name +','like'%''+ sc.name +',%''(ms sql字符串连接语法)。 – Serg

传递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实现可能具有相同的一种行为

+0

嗨@ hunter,谢谢你的回答。我用你的想法传递参数作为字符串列表,它为我工作,因此将eclipselink JPA代码添加到您的答案。再次感谢:) – DharmasriS

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

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

的。如果你坚持,名字是字符串类型的“A,B ,C“,我看到2个选项: 1)每次构建sql,没有参数

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

如果NAMES来自用户输入,它将受到sql注入的约束。与参数,但性能比较

2)SQL注入安全的选择可能会比较慢,优化程序无法使用索引

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