Micronaut Data(JDBC)w/Postgres通过后台处理生成SQL



我的应用程序在H2测试数据库中运行得很好,但当我在Postgresql中运行它时,它会创建带有backticks的sql。我错过了什么?

编辑

这是一个环境问题。我有一个测试存储库,它扩展了下面的存储库,但使用了H2方言。我无意中把这个bean放在了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
}

应用程序.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目录中,因此它与生产版本相冲突。

最新更新