سؤال

كنت أتساءل عما إذا كانت هناك طريقة أكثر أناقة للقيام بها في () الاستعلامات مع JDBCTEMPLate الربيع. حاليا أفعل شيئا من هذا القبيل:

StringBuilder jobTypeInClauseBuilder = new StringBuilder();
for(int i = 0; i < jobTypes.length; i++) {
    Type jobType = jobTypes[i];

    if(i != 0) {
        jobTypeInClauseBuilder.append(',');
    }

    jobTypeInClauseBuilder.append(jobType.convert());
}

وهو مؤلم تماما لأنه إذا كان لدي تسعة خطوط لمجرد بناء جملة الاستعلام في (). أود الحصول على شيء مثل استبدال المعلمة البيانات المعدة

هل كانت مفيدة؟

المحلول

تريد مصدر المعلمة:

Set<Integer> ids = ...;

MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("ids", ids);

List<Foo> foo = getJdbcTemplate().query("SELECT * FROM foo WHERE a IN (:ids)",
     parameters, getRowMapper());

هذا يعمل فقط إذا getJdbcTemplate() إرجاع مثيل من النوع NamedParameterJdbcTemplate

نصائح أخرى

أنا أقوم بالاستعلام عن "البند" مع الربيع JDBC مثل هذا:

String sql = "SELECT bg.goodsid FROM beiker_goods bg WHERE bg.goodsid IN (:goodsid)";

List ids = Arrays.asList(new Integer[]{12496,12497,12498,12499});
Map<String, List> paramMap = Collections.singletonMap("goodsid", ids);
NamedParameterJdbcTemplate template = 
    new NamedParameterJdbcTemplate(getJdbcTemplate().getDataSource());

List<Long> list = template.queryForList(sql, paramMap, Long.class);

إذا حصلت على استثناء من أجل: نوع عمود غير صالح

من فضلك استخدم getNamedParameterJdbcTemplate() بدلا من getJdbcTemplate()

 List<Foo> foo = getNamedParameterJdbcTemplate().query("SELECT * FROM foo WHERE a IN (:ids)",parameters,
 getRowMapper());

لاحظ أن الحجج الثاني مبتذلة حولها.

تشير إلى هنا

اكتب الاستعلام مع المعلمة المسماة، واستخدام بسيط ListPreparedStatementSetter مع جميع المعلمات بالتسلسل. أضف فقط Snippet لتحويل الاستعلام في النموذج التقليدي بناء على المعلمات المتوفرة،

ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(namedSql);

    List<Integer> parameters = new ArrayList<Integer>();
    for (A a : paramBeans)
        parameters.add(a.getId());

    MapSqlParameterSource parameterSource = new MapSqlParameterSource();
    parameterSource.addValue("placeholder1", parameters);
    // create SQL with ?'s
    String sql = NamedParameterUtils.substituteNamedParameters(parsedSql, parameterSource);

    return sql;

تغيرت أشياء كثيرة منذ عام 2009، ولكن يمكنني فقط العثور على إجابات قائلة أنك بحاجة إلى استخدام NamedParametersjdbctemplate.

بالنسبة لي يعمل إذا كنت فقط أفعل

db.query(sql, new MyRowMapper(), StringUtils.join(listeParamsForInClause, ","));

باستخدام SimpleJDBCTEMPLate أو JDBCTEMPLate

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top