spring-boot - 检索表连接的结果

标签 spring-boot jpa kotlin spring-data-jpa

在 Spring-Boot 项目中,有两个实体(从 Kafka 消费并)独立地持久化到 PostgreSQL 数据库中。

从语义上讲,它们共享相同的 id ,我想加入表格并检索结果。

当然,我可以使用 native 查询等,但如果可行,我更喜欢更高级的方法。如果这有意义的话,也许检索连接会产生一种新型的数据类?

这是一个最小的例子,我的意思是:

@Entity
@Table(name = "foo")
data class Foo(
    @Id
    var id: Long,
    val fooval: Long
)

@Repository
interface FooRepository : JpaRepository<Foo, Long>


@Entity
@Table(name = "bar")
data class Bar(
    @Id
    var id: Long,
    val barval: Long
)

@Repository
interface BarRepository : JpaRepository<Bar, Long>

CREATE TABLE foo(
    id        BIGINT PRIMARY KEY NOT NULL,
    fooval    BIGINT NOT NULL
);

CREATE TABLE bar(
    id        BIGINT PRIMARY KEY NOT NULL,
    barval    BIGINT NOT NULL
);
Foo不拥有 Bar或相反亦然。这些表的清理(实体删除)不是问题。

所以我目前检索连接结果的解决方案如下所示:
@Entity
data class FooBar(
    @Id
    var id: Long,
    val fooval: Long,
    val barval: Long
)

@Repository
interface FooBarRepository : JpaRepository<FooBar, Long> {
    @Query(
        nativeQuery = true,
        value = "SELECT foo.id, fooval, barval FROM foo, bar WHERE foo.id = bar.id;"
    )
    fun fetchAll(): Iterable<FooBar>
}

但这真的是明智的选择吗?

最佳答案

这是您的场景在本地工作和测试的实现:

package entityrelationtest

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query
import org.springframework.stereotype.Repository
import javax.persistence.Entity
import javax.persistence.Id
import javax.persistence.Table

@Entity
@Table(name = "foo")
data class Foo(
    @Id
    var id: Long,
    val fooval: Long
)

@Entity
@Table(name = "bar")
data class Bar(
    @Id
    var id: Long,
    val barval: Long
)

data class FooBar(
    @Id
    var id: Long,
    val fooval: Long,
    val barval: Long
)

@Repository
interface FooRepository : JpaRepository<Foo, Long> {
    @Query(value = "SELECT new entityrelationtest.FooBar(f.id, f.fooval, b.barval) FROM Foo f, Bar b WHERE f.id = b.id")
    fun findAllFooBar(): Iterable<FooBar>
}

@Repository
interface BarRepository : JpaRepository<Bar, Long>

@SpringBootApplication
class Application

fun main(args: Array<String>) {
    runApplication<Application>(*args)
}

它也缺少表的别名。并且 SELECT new to JPA 为每一行创建一个对象。

关于spring-boot - 检索表连接的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56631358/

相关文章:

java - HystrixCommand 注释导致 ControllerLinkBuilder 中断

java - 具有 Activity 配置文件的 Spring Batch 仍在寻找 Application.properties

spring-boot - Spring Cloud Messaging Source未向Kafka代理发送消息

java - jpa "dirty"交易

java - EJB 3 预加载

Android Jetpack Compose 尝试对齐框内的文本

java - 如何使用 MockMVC 对 Spring-Boot REST 端点进行单元测试,其中路径映射是环境变量?

java - 无法分配连接,因为 : User id length (0) is outside the range of 1 to 255

android - 如何混淆我用 kotlin 编码的 sdk(并摆脱元数据)

android - 导航组件 Kotlin - 无法从当前目的地找到