在一个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>
}
但这真的是理智的方法吗?
答案 0 :(得分:1)
这是您的方案的实现并在本地进行测试:
load: async (loadOptions) => {
console.log('this: ', this);
console.log('loadOptions: ', loadOptions);
const paginatedData = { Text: loadOptions.searchValue, PageNo: loadOptions.skip, PageSize: loadOptions.take};
const result = await this.reportsService.getRegionsMetaData(paginatedData)
.toPromise();
console.log('this.reportsService.getRegionsMetaData("{' + loadOptions.searchValue + ' })', result);
result.map((resultItem) => {
resultItem.Value = `${resultItem.Key} - ${resultItem.Value}`;
return resultItem;
});
this.addNewItemsToRegionLookup(result);
return result;
}
它也缺少表的别名。 JPA的SELECT新增功能为每行创建一个对象。