在 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/