2016-09-16 16 views
1

我打電話我的主類使用實體管理器命名查詢,如下如何在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

回答

1

傳遞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

1

對於SQL ARRAY,JDBC有Array類,對於某些用法,如createArrayOf

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

的。如果你堅持,名字是字符串類型的「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 || ',%'" 
相關問題