2010-08-31 9 views
9

Bu gibi bir şey yapabilir miyim: JDBCTemplate'dan in() deyiminde kullanmak için bir liste parametresi genişletmesini isteyebilir miyim?

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

... ve parametrelerime genişletilecek bir liste veya argüman dizisini iletme, yani:

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

Özellikle kullanıyorum İlkbahar ve JdbcTemplate/SimpleJdbcTemplate sınıfları.

+1

Hatırladığım yok olduğu aşağıdaki kodu bulabilirsiniz - '' tutucu o SQL olduğu gibi tek bir değeri ifade eder, bu yüzden içeremez: Böyle bir şey çalışması gerekir virgülle ayrılmış liste. –

+0

Hem http://stackoverflow.com/questions/1981683/how-to-generate-a-dynamic-in-sql-list-through-spring-jdbctemplate ve http://stackoverflow.com/questions/1327074 adreslerinin olası kopyaları/how-to-sql-sorgular-ile-springs-jdbctemplate-effectivly nasıl yapılır – Stewart

cevap

5

Üzgünüm, bunu yapamam. Bunu yapmak için bir kolaylık yöntemi yazabilirsiniz, ancak bildiğim kadarıyla, Hibernate gibi setParameterList() diye bir şey yok.

+1

Sayısal türleri listesi için en kolay kolaylık yöntemi, list.toString() olabilir. değiştirin ("[", "(") .replace ("]", ")") – Stewart

26

Bunu NamedParameterJdbcTemplate kullanarak yapabilirsiniz. Eğer Bahar 3'te adlandırılmış parametresini kullanarak yapabilirsiniz Evet

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

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

Teşekkürler! Bir NamedParameterJdbcTemplate bir starndard JdbcTemplate oluşturabileceğiniz edilebileceğini belirtmekte yarar var: NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate (jdbcTemplate); – Ivo

0

: Örneğinize ile

gibi bir şey gider.

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

Bu ilkel herhangi listesini alıp listesini genişletmek gerektiğini bakın. Sadece listenizin DB'nizin desteklediği maksimum boyutu geçmemesine dikkat edin. (Oracle sınırı 1000'dir). ?

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; 

    } 
İlgili konular