首页 > 解决方案 > 查询可能不存在的行的正确方法 - Java8

问题描述

我正在尝试编写一种方法来检索数据库中的一行。大约 50% 的时间,该行将不存在。我尝试使用 jdbcTemplate.queryForObject,但是如果数据库中不存在该行,则会引发异常。我不认为尝试捕获该方法是一种好习惯。

我读到如果您的数据可能为空,jdbcTemplate.query 是一个更好的选择。但只有返回一个列表,我才能让它工作。返回一个列表在这里并没有什么意义,因为我只选择了 1 行,它可能存在也可能不存在。

public List<LoanDetailsBean> getLoanDetailsByInsaddr(String insaddr) {
     String SQL_GET_LOAN_DETAILS_BY_INSADDR =
                "SELECT TOP 1 cip.tranchesize, " +
                        "             cip.maturitydate, " +
                        "             cip.moodysissuerrating, " +
                        "             cip.snpissuerrating, " +
                        "             cip.moodysassetrating, " +
                        "             cip.snpassetrating " +
                        "FROM   cloinstrumentproperty cip " +
                        "WHERE  insaddr = ? " +
                        "ORDER  BY updatedtime DESC ";

     return isdbJdbcTemplate.query(SQL_GET_LOAN_DETAILS_BY_INSADDR, new Object[] { insaddr }, (rs, rowNum) ->
             new LoanDetailsBean(
                  rs.getDouble("tranchesize"),
                  rs.getString("maturitydate"),
                  rs.getString("moodysissuerrating"),
                  rs.getString("snpissuerrating"),
                  rs.getString("moodysassetrating"),
                  rs.getString("snpassetrating")
             )
     );
}

我怎样才能重新编写它以使其更有意义?

标签: javaspringjdbcjdbctemplate

解决方案


是否可以选择在您的项目中使用 3rd-party 库?

这可以用我自己的方法更简单地完成:

<dependency>
   <groupId>com.github.buckelieg</groupId>
   <artifactId>db-fn</artifactId>
   <version>0.3.4</version>
</dependency>

接着:

public List<LoanDetailsBean> getLoanDetailsByInsaddr(String insaddr) {
    try (DB db = new DB("jdbc:postgresql://host:port/database?user=user&password=pass")) {
         return db.select("SELECT TOP 1 cip.tranchesize, cip.maturitydate, cip.moodysissuerrating, cip.snpissuerrating, cip.moodysassetrating, cip.snpassetrating FROM cloinstrumentproperty cip WHERE insaddr=? ORDER BY updatedtime DESC", insaddr)
             .list(rs -> new LoanDetailsBean(rs.getDouble("tranchesize"), rs.getString("maturitydate"), rs.getString("moodysissuerrating"), rs.getString("snpissuerrating"), rs.getString("moodysassetrating"), rs.getString("snpassetrating"))));
    }
}

推荐阅读