检索表联接的结果

时间:2019-06-17 12:30:31

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

在一个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 个答案:

答案 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新增功能为每行创建一个对象。