将不同类型的参数传递给jdbctemplate查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将不同类型的参数传递给jdbctemplate查询相关的知识,希望对你有一定的参考价值。

我试图通过使用where子句与几个不同类型的参数从数据库中检索记录。这是我写的一个简单的方法,我将breedId和gender作为参数传递。

public List<Dog> listByBreedIdAndGender(long breedId, String gender) {  
  return query("SELECT * FROM dog_entity WHERE breed__id = ? AND gender = ?",
          new MapSqlParameterSource(":breedId", breedId)
          .addValue(":gender", gender));
 }

private List<Dog> query(String sql, MapSqlParameterSource parameters) {  
  List<Dog> dogs = jdbcTemplate.query(sql, new DogRowMapper(), parameters);
  return dogs;
 }

我跑了这个方法,但得到了以下异常。任何人都可以让我知道如何将多个参数传递给jdbcTemplate.query(),我是一个新的。

{
timestamp: 1419637479460
status: 500
error: "Internal Server Error"
exception: "org.springframework.dao.TransientDataAccessResourceException"
message: "PreparedStatementCallback; SQL [SELECT * FROM dog_entity WHERE breed__id = ? AND gender = ?]; Invalid argument value: java.io.NotSerializableException; nested exception is java.sql.SQLException: Invalid argument value: java.io.NotSerializableException"
path: "/api/2/m"
}
答案

请用

public List<Dog> listByBreedIdAndGender(long breedId, String gender) {  
   return jdbcTemplate.query("SELECT * FROM dog_entity WHERE breed__id = :breedId AND gender =:gender", 
      new MapSqlParameterSource()
      .addValue("breedId", breedId)
      .addValue("gender", gender));
}

请确保jdbcTemplate是NamedParameterJdbcTemplate

如果你需要使用JdbcTemplate然后

    public List<Dog> listByBreedIdAndGender(long breedId, String gender) {  
       return jdbcTemplate.query
          ("SELECT * FROM dog_entity WHERE breed__id = ? AND gender = ?",
          new Object[] { breedId, gender }, 
          new DogRowMapper());         
    }

或者如果您坚持使用私有查询方法

public List<Dog> listByBreedIdAndGender(long breedId, String gender) {  
       return query
          ("SELECT * FROM dog_entity WHERE breed__id = ? AND gender = ?",
          new Object[] { breedId, gender });         
}

private List<Dog> query(String sql, Object[] parameters) {  
   List<Dog> dogs = jdbcTemplate.query(sql, parameters, new DogRowMapper());
   return dogs;

}

请确保breed__id具有正确的_字符数。

概念是使用NamedParameterJdbcTemplate和参数指定的名称:name(例如:gender)或带有位置参数的简单JdbcTemplate(例如new Object [] {breedId,gender}其中breedId匹配第一个?性别是第二个?) 。

以上是关于将不同类型的参数传递给jdbctemplate查询的主要内容,如果未能解决你的问题,请参考以下文章

将枚举类型作为参数传递给 GraphQL 查询 - Quarkus

GraphQl 将查询参数传递给子类型

Java:将具有不同类型的参数传递给函数

SSAS - 将 MDX 报告参数传递给 MDX 数据集查询

将参数传递给角度指令

将参数传递给 OLE DB SOURCE