带Postgres的Micronaut数据JDBC生成带有backtics的SQL

问题描述

我的应用程序可以很好地在H2测试数据库上运行,但是当我在Postgresql中运行它时,它将创建带有反引号的sql。我想念什么?

编辑

这是一个环境问题。我有一个测试存储库,该存储库扩展了以下存储库,但使用了H2方言。我无意中将此豆放在src.main.java中,而不是src.test.java中。如果遇到此问题,请查看使用H2的任何测试资源或配置。

INSERT INTO `email_event` (`event_dts`,`category`,`email`,`event`,`sg_template_name`,`template_id`,`template_version_id`,`uid`,`campaign_name`,`major_classification`,`minor_classification`,`sg_event_id`) VALUES (?,?,?)

Postgresql不喜欢它,应用程序引发此异常:

io.micronaut.data.exceptions.DataAccessException: SQL Error executing INSERT: ERROR: syntax error at or near "`" Position: 13

build.gradle

我正在使用Micronaut Data,JDBC,micronaut-hibernate-jpa(用于Entity类),hikari db连接池和Postgres jdbc驱动程序。

dependencies {
    annotationProcessor("io.micronaut.data:micronaut-data-processor")
    implementation("io.micronaut:micronaut-validation")
    implementation("io.micronaut:micronaut-runtime")
    implementation("javax.annotation:javax.annotation-api")
    implementation("io.micronaut:micronaut-http-client")
    implementation("io.micronaut.sql:micronaut-jdbc-hikari")
    implementation("io.micronaut.data:micronaut-data-jdbc")
    compileOnly("io.micronaut.sql:micronaut-hibernate-jpa") //For @Entity
    compileOnly("io.micronaut.spring:micronaut-spring-context")
    runtimeOnly("ch.qos.logback:logback-classic")
    runtimeOnly("com.h2database:h2")
    compile("org.postgresql:postgresql:42.2.16")// <- Tried changing versions with no luck
}

application.yml

我在配置中指定了POSTGRES方言(也许我需要更多?)

datasources:
  default:
    url: jdbc:postgresql://my.dburl.com:5432/my_db
    driverClassName: org.postgresql.Driver
    username: username
    password: supersecret
    dialect: POSTGRES
    auto-commit: true

存储库类

存储库是基本的,并重复了方言配置。

package com.access.dao;

import com.access.model.EmailEvent;
import io.micronaut.data.jdbc.annotation.JdbcRepository;
import io.micronaut.data.model.query.builder.sql.Dialect;
import io.micronaut.data.repository.CrudRepository;


@JdbcRepository(dialect = Dialect.POSTGRES)
public interface EventRepository extends CrudRepository<EmailEvent,String> {
}

实体类

Entity类也是基本的。

package com.access.model;

import com.fasterxml.jackson.annotation.JsonProperty;
import io.micronaut.core.annotation.Introspected;
import io.micronaut.data.annotation.Id;
import io.micronaut.data.annotation.MappedEntity;

import javax.annotation.Nullable;
import javax.persistence.Column;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.List;

@Introspected
@MappedEntity
public class EmailEvent {
    @Id
    @JsonProperty("sg_event_id")
    @Column(name = "sg_event_id")
    private String sgEventID;

    private List<String> category;
    @Column
    private String email;
    @Column
    private String event;

    @JsonProperty("sg_template_name")
    @Column(name="sg_template_name")
    @Nullable
    private String sgTemplateName;

    @JsonProperty("template_id")
    @Column(name = "template_id")
    @Nullable
    private String templateID;

    @JsonProperty("template_version_id")
    @Column(name = "template_version_id")
    @Nullable
    private String templateVersionID;

    private Long timestamp;

    @Nullable
    private String uid;

    @JsonProperty("campaign_name")
    @Column(name="campaign_name")
    @Nullable
    private String campaignName;

    @JsonProperty("major_classification")
    @Column(name = "major_classification")
    @Nullable
    private String majorClassification;

    @JsonProperty("minor_classification")
    @Column(name = "minor_classification")
    @Nullable
    private String minorClassification;

    
    @Column(name="event_dts")
    public LocalDateTime getEventDts(){
        return Instant
                .ofEpochSecond(this.timestamp)
                .atZone(
                        ZoneId.of("America/Denver")
                ).toLocalDateTime();
    }

    public String getCategory(){
        return String.join(",",this.category);
    }

    public void setCategory(List<String> category) {
        this.category = category;
    }

    // Other getters/setters
}

解决方法

这是我放置测试库的地方的问题。我(通过复制生产类)创建了一个测试库,用于内存中的H2数据库。

@Replaces(EventRepository.class)
@JdbcRepository(dialect = Dialect.H2)
public interface TestEventRepository extends EventRepository {

}

但是,我忽略了将此类移至src.test.java目录,因此与生产版本冲突。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...