当前位置: 首页 > 知识库问答 >
问题:

Spring Boot:无法推断用于java.time.LocalDateTime实例的SQL类型

郎俊雅
2023-03-14
public int[] bulkSaveInvoices(List<Invoice> invoices){

    String insertSQL = "INSERT INTO invoices VALUES (:id, :exactIssueTime, :finalIssueTime, :issuer, :groupID)";
    SqlParameterSource[] sqlParams = SqlParameterSourceUtils.createBatch(invoices.toArray());

    int[] insertCounts = namedParameterJdbcTemplate.batchUpdate(insertSQL, sqlParams);

    return insertCounts;
}
├── Invoice.java
├── InvoiceRepository.java
└── persistance
    ├── converters
    │   ├── LocalDateAttributeConverter.java
    │   └── LocalDateTimeAttributeConverter.java
    └── JdbcInvoiceRepository.java

LocalDateTime得转换器:

@Converter(autoApply = true)
public class LocalDateTimeAttributeConverter implements AttributeConverter<LocalDateTime, Timestamp> {

    @Override
    public Timestamp convertToDatabaseColumn(LocalDateTime locDateTime) {
        return (locDateTime == null ? null : Timestamp.valueOf(locDateTime));
    }

    @Override
    public LocalDateTime convertToEntityAttribute(Timestamp sqlTimestamp) {
        return (sqlTimestamp == null ? null : sqlTimestamp.toLocalDateTime());
    }
}

然而,当我在测试中执行它时,我一直得到错误:

org.springframework.jdbc.badsqlgrammarexception:PreparedStatementCallback;错误的SQL语法[插入发票值(?,?,?,?,?)];嵌套的异常是org.postgresql.util.psqlexception:无法推断用于java.time.LocalDateTime实例的SQL类型。使用带有显式Types值的setObject()来指定要使用的类型。

问题可能是什么?如何解决?

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-rest</artifactId>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>

    <!--For less boilerplate code-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>

    <!--JSR 330 for DI in Java - @Inject-->
    <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>javax.inject</artifactId>
        <version>1</version>
    </dependency>

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>


<repositories>
    <repository>
        <id>spring-releases</id>
        <url>https://repo.spring.io/libs-release</url>
    </repository>
</repositories>
<pluginRepositories>
    <pluginRepository>
        <id>spring-releases</id>
        <url>https://repo.spring.io/libs-release</url>
    </pluginRepository>
</pluginRepositories>
@Repository
public class JdbcInvoiceRepository {

    @Inject
    private JdbcTemplate jdbcTemplate;
    @Inject
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    private SimpleJdbcInsert simpleJdbcInsert;

    @PostConstruct
    public void setupSimpleJdbcInsert(){
        simpleJdbcInsert =
                new SimpleJdbcInsert(jdbcTemplate).withTableName("invoices").usingGeneratedKeyColumns("id");
    }

    public int[] bulkSaveInvoices(List<Invoice> invoices){

        String insertSQL = "INSERT INTO invoices VALUES (:id, :exactIssueTime, :finalIssueTime, :issuer, :groupID)";
        SqlParameterSource[] sqlParams = SqlParameterSourceUtils.createBatch(invoices.toArray());

        int[] insertCounts = namedParameterJdbcTemplate.batchUpdate(insertSQL, sqlParams);

        return insertCounts;
    }

    public Long getInvoiceCount() {
        return jdbcTemplate.queryForObject("select count(*) from invoices",
                Long.class);

    }

}

编辑invoice.java

@Data
@AllArgsConstructor

@Entity
@Table(name = "invoices")
public class Invoice {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    Long id;

    @Column(name = "exact_iss_time")
    private LocalDateTime exactIssueTime;

    @Column(name = "final_iss_time")
    private LocalDateTime finalIssueTime;

    @Column(name = "issuer")
    private String issuer;

    @Column(name = "groupid")
    private Integer groupID;

    protected Invoice() {
    }

}

发票表定义

    CREATE TABLE invoices (
  id      SERIAL PRIMARY KEY,
  exact_iss_time TIMESTAMP NOT NULL,
  actual_iss_time TIMESTAMP NOT NULL,
  issuer    TEXT NOT NULL,
  groupid   INTEGER NOT NULL
);

共有1个答案

暨弘毅
2023-03-14

1)不要使用JDBC尝试批量保存JPA实体

2)改用Spring Data JPA

3)定义Spring数据存储库如下:

public interface InvoiceRepository  extends JpaRepository<Invoice, Long> {}
 类似资料:
  • 如何将Java7类型推断用于泛型实例创建功能?使用这种新样式有什么好处?

  • 我的分类测试应用程序有一个问题,我使用了一个比较器。我收到一条信息: 线程“主”java.lang 中的异常:未解决的编译问题:无法推断排序器的类型参数 对于该代码: 分拣机类: 可比接口: id比较器类: 比较器接口: 这样用有什么错?我怎样才能做得更好?

  • 问题内容: 我尝试扫描有关本地类型推断的JEP-286。我看到这仅适用于局部变量- 了解。因此这确实有效: 我确实看到,另一方面,它无法编译: 很明显,事实并非如此,因为JEP是这样说的。现在我的问题是: 对于宣布失败的 公共/受保护 成员,至少是IMO,这是完全合理的。但是,为什么即使编译也不编译呢?我只能假设您仍然可以通过反射保留该变量(而我无法获得这样的局部字段)…而且获取该变量可能需要强制

  • 我想实现Spring endpoint,在其中我可以返回XML对象< code > notification echo response 和http状态代码。我试过这个: 但是我收到错误:

  • 我仍然在玩我的日历,我已经设法将 https://github.com/SundeepK/CompactCalendarView 整合到我的一个片段中。只剩下一个错误,我做了一些研究,其他人也遇到了问题,例如使用ArrayList 示例代码: IDE说: 注:C:...\Uebersicht.java使用或覆盖不推荐使用的API。注意:用-Xlint:deprecation重新编译以获得详细信息。

  • MacOS Catalina 10.15.7,VSCode 1.64.2(通用):我让智能感知为我的项目工作没有问题,但是无论出于什么原因,它在某些情况下都停止工作: 每当我将某些东西分配给“自动变量”时,例如:我会得到智能感知错误:。 类枚举没有被识别,所以我不能使用或获得任何与枚举相关的自动完成支持。 这些是最常见的问题,但我要说智能感知通常不能正常工作。 我删除了与VSCode相关的所有内容