如何在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变量进行比较,从而返回结果列表。
如何将单个子串匹配到一个字符串?
答
传递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 || ',%'"
需要构建使用'查询字符串:NAME'。 SQL不接受列表作为单个参数。 –
NAMES变量中的参数个数不固定。那么我们可以构造这样的SQL查询吗? – DharmasriS
使用像'where','+:name +','like'%''+ sc.name +',%''(ms sql字符串连接语法)。 – Serg