2010-08-31 23 views
9

我可以做這樣的事情:我可以讓JDBCTemplate擴展一個用於in()子句的列表參數嗎?

select * from mytable m where m.group_id in (?) 

...,並通過在列表或參數數組中的我的參數進行擴展,即:

select * from mytable m where m.group_id in (1,2,3,4) 

具體來說,我使用Spring和JdbcTemplate/SimpleJdbcTemplate類。

+1

我的回憶是否 - ''佔位符表示一個值,因爲它會在SQL,因此它不能包含哪些內容?一個逗號分隔的列表。 – 2010-08-31 23:17:16

+0

可能的重複都是http://stackoverflow.com/questions/1981683/how-to-generate-a-dynamic-in-sql-list-through-spring-jdbctemplate和http://stackoverflow.com/questions/1327074 /如何在sql-queries-with-springs-jdbctemplate-effectivly中執行 – Stewart 2013-06-03 09:29:26

回答

5

對不起,不能這樣做。據我所知,你可以自己寫一個方便的方法來做到這一點,但沒有像Hibernate那樣的setParameterList()

+1

最簡單的便捷方法,對於數字類型列表可能是list.toString()。replace(「[」,「(」)) .replace(「]」,「)」) – Stewart 2013-06-03 09:30:54

26

您可以通過使用NamedParameterJdbcTemplate來完成。是的,你可以在Spring 3使用命名參數

NamedParameterJdbcTemplate db = ...; 
List paramList = ...; 

Map idsMap = Collections.singletonMap("ids", paramList); 
db.query("select * from mytable m where m.group_id in (:ids)", idsMap); 
+1

謝謝!值得一提的是,NamedParameterJdbcTemplate可以通過一個星型JdbcTemplate創建: NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate); – Ivo 2015-06-08 14:26:25

0

與樣品它會去像。

http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html#jdbc-in-clause

應該採取元的任何列表和擴展列表。請注意,您的列表不會超過您的數據庫支持的最大大小。 (Oracle限制爲1000)。像這樣的東西應該工作:

List<Integer> ids = new ArrayList<Integer>(); 
    ids.add(1); 
    ids.add(2); 
    ids.add(3); 

    Map<String,Object> params = new HashMap<String, Object>(); 

    String sql = "SELECT PERSON.ID, PERSON.USERNAME, PERSON.EMAIL_ADDRESS, PERSON.FIRST_NAME, PERSON.LAST_NAME, PERSON.ACCOUNT_STATUS FROM PERSON WHERE ID IN (:ids)"; 
    params.put("ids",ids); 

    return getSimpleJdbcTemplate().query(sql, rowMapper, params); 
2

請找到下面的代碼

public Collection<Employee> findByIds(List<String> ids) { 

     Map<String, Object> params = new HashMap<String, Object>(); 
     params.put("ids", ids); 

     List<Employee> employees = namedParameterJdbcTemplate.query(
       "SELECT * FROM trn_employee where employee_id IN (:ids)", 
       params, 
       ParameterizedBeanPropertyRowMapper.newInstance(Employee.class)); 

     return employees; 

    } 
相關問題