Получение результатов объединения таблиц - PullRequest
1 голос
/ 17 июня 2019

В проекте Spring-Boot есть две сущности (полученные из Kafka и), которые сохраняются в базе данных PostgreSQL независимо.

Семантически они имеют один и тот же id, и я хотел бы объединить таблицы по этому вопросу и получить результаты.

Конечно, я мог бы использовать нативные запросы и т. Д., Но, если это возможно, я бы предпочел более высокоуровневый подход. Может быть, получение результатов объединения в новом типе класса данных, если это имеет смысл?

Вот минимальный пример того, что я имею в виду:

@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>
}

Но разве это разумный путь?

1 Ответ

1 голос
/ 18 июня 2019

Вот реализация для вашего сценария, работающая и протестированная локально:

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, новый для JPA, создает объект для каждой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...