如何使用 Spring JdbcTemplate 和普通 SQL 获取数据库信息(Micronaut)

How to get db information using Spring JdbcTemplate and plain SQL (Micronaut)

我正在尝试使用 Micronaut 创建 Web 应用程序,需要使用 Spring JdbcTemplate 和 plain 从 travelLog table 获取信息 SQL。我正在使用本教程 https://www.greggbolinger.com/posts/using-springs-jdbctemplate-with-micronaut/ 来解决这个问题,但我遇到了以下问题:

30.869 [default-nioEventLoopGroup-1-2] ERROR i.m.h.s.netty.RoutingInBoundHandler - Unexpected error occurred: StatementCallback; bad SQL grammar [SELECT * FROM travelLog]; nested exception is org.postgresql.util.PSQLException: ERROR: relation "travellog" does not exist
      Position: 15
    org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [SELECT * FROM travelLog]; nested exception is org.postgresql.util.PSQLException: ERROR: relation "travellog" does not exist
      Position: 15
        at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:237)
        at

这是 travelLog table 架构

<?xml version="1.0" encoding="UTF-8"?>

<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
    <changeSet id="01" author="julia">
        <createTable tableName="travelLog"
                     remarks="A table to contain all travel logs">

            <column name="id" type="int">
                <constraints nullable="false" unique="true" primaryKey="true"/>
            </column>

            <column name="date" type="timestamp">
                <constraints nullable="false"/>
            </column>

            <column name="regNumber" type="varchar">
                <constraints nullable="false"/>
            </column>

            <column name="ownersName" type="varchar(50)">
                <constraints nullable="false"/>
            </column>

            <column name="odometerValueBeg" type="int">
                <constraints nullable="false"/>
            </column>

            <column name="odometerValueEnd" type="int">
                <constraints nullable="false"/>
            </column>

            <column name="departurePlace" type="varchar(255)">
                <constraints nullable="false"/>
            </column>

            <column name="destinationPlace" type="varchar(255)">
                <constraints nullable="false"/>
            </column>

            <column name="description" type="varchar">
            </column>

        </createTable>
    </changeSet>
</databaseChangeLog>

这里是JdbcTemplateFactory.java

@Factory
public class JdbcTemplateFactory {

    @Inject
    DataSource dataSource;

    @Bean
    @Singleton
    JdbcTemplate jdbcTemplate() {
        return new JdbcTemplate(dataSource);
    }

}

这里是TravelLogService.java

@Singleton
@Requires(beans = JdbcTemplate.class)
public class TravelLogService {

  private final JdbcTemplate jdbcTemplate;

  public TravelLogService(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
  }

  @Transactional
  public void printUsernames() {
    jdbcTemplate.query("SELECT * FROM travelLog", (rs) -> {
      System.out.println(rs.getString("ownersName"));
    });
  }

要创建和查询区分大小写的 table、列等,必须像这样引用名称:

SELECT * FROM "travelLog"

对于 liquibase 设置,请检查此答案

另外请考虑更改您的 naming conventions