spring JDBCTemplate查找是否存在行

vmdwslir  于 2023-04-19  发布在  Spring
关注(0)|答案(4)|浏览(225)

我很好奇我应该如何使用springs jdbctemplate类来确定一个记录或行是否已经存在于我的一个表中??我已经尝试过了

int count = jdbcTemplate.queryForObject("select * from MyTable
                                  where Param = ?", new Object[] {myParam},
                                  Integer.class);
if(count ==0)
    //record does not exist

问题是,虽然我一直得到EmptyResultAccessDataException的,当它不存在,所以我更新了代码

try{
    jdbcTemplate.queryForObject("select * from MyTable
                                  where Param = ?", new Object[] {myParam},
                                  Integer.class);
} catch(EmptyResultAccessDataException e) {//insert the record}

所以我想我真实的的问题是什么是最好的方法来搜索一个记录存在于一个表中,因为我想添加说,如果它不存在,什么也不做,如果它是。

8fq7wneg

8fq7wneg1#

你可以使用类似这样的东西:

String sql = "SELECT count(*) FROM MyTable WHERE Param = ?";
boolean exists = false;
int count = getJdbcTemplate().queryForObject(sql, new Object[] { "paramValue" }, Integer.class);
exists = count > 0;

安吉洛

uemypmqf

uemypmqf2#

如果存在数据库支持(例如Postgres),最好使用它:

String query = "SELECT EXISTS(SELECT * FROM table_name WHERE ...)";
boolean exists = jdbcTemplate.queryForObject(query, params, Boolean.class);

Fastest check if row exists in PostgreSQL

u5rb5r59

u5rb5r593#

使用 JdbcTemplatequery方法更适合这种情况,因为它们允许返回零行(没有EmptyResultDataAccessException):

boolean hasRecord =
  jdbcTemplate
    .query("select 1 from MyTable where Param = ?",
      new Object[] { myParam },
      (ResultSet rs) -> {
        if (rs.next()) {
          return true;
        }
        return false;
      }
    );
ivqmmu1c

ivqmmu1c4#

让我合并Anton YurievReginaldo SantosAngelo Immediata的几个答案,并使用Kotlin给予这个问题的简短解决方案。
如果你需要检查一个表中是否存在一行,这里有一个很好的解决方案。在这种情况下,表中的所有记录都是唯一的:

fun checkReportExists(date: LocalDate): Boolean {
        val sql = """select 1 from reports_table where report_date = :date"""
        val map = MapSqlParameterSource("date", date)
        return jdbcTemplate.query(sql, map, ResultSetExtractor { rs -> rs.next() })!!
    }

第二解决方案:

fun checkReportExists(date: LocalDate): Boolean {
        val sql = """select count(1) from reports_table where report_date = :date"""
        val map = MapSqlParameterSource("date", date)
        return jdbcTemplate.queryForObject(sql, map, Int::class.java)!! > 0

最后一个解决方案:

fun checkReportExists(date: LocalDate): Boolean {
        val sql = """select exists(select 1 from reports_table where report_date = :date)"""
        val map = MapSqlParameterSource("date", date)
        return jdbcTemplate.queryForObject(sql, map, Boolean::class.java)!!

P.S.最后一个解决方案是fastest,用于检查行是否存在。

相关问题