以postgresqljson字段作为map< key,value>

nfs0ujit  于 2021-07-26  发布在  Java
关注(0)|答案(0)|浏览(217)

我正在使用带有kotlin和postgresql的spring boot作为db。对于我使用的json字段 hibernate-types-52 :

  1. dependencies {
  2. ...
  3. implementation("com.vladmihalcea:hibernate-types-52:2.10.2")
  4. ...
  5. }

我有一个实体地址和street json字段:

  1. @Entity
  2. @Table(name = "addresses")
  3. @TypeDefs(
  4. TypeDef(name = "jsonb", typeClass = JsonBinaryType::class),
  5. TypeDef(name = "json", typeClass = JsonStringType::class),
  6. )
  7. data class Address(
  8. @Id
  9. var id: Int? = null,
  10. @Type(type = "jsonb")
  11. @Column(name = "street", columnDefinition = "json", nullable = false)
  12. var street: Map<Language, String>,
  13. @Column(name = "zip_code" nullable = false)
  14. var zipCode: String,
  15. @Column(name = "created_at", nullable = false, updatable = false)
  16. @CreationTimestamp
  17. var createdAt: Date? = null,
  18. @Column(name = "updated_at", nullable = false)
  19. @UpdateTimestamp
  20. var updatedAt: Date? = null,
  21. }

相应的存储库是:

  1. @Repository
  2. interface AddressRepository : JpaRepository<Address, Int> {
  3. fun findStreetByZipCode(zipCode: String): AddressStreetOnly?
  4. }

其中addressstreetonly是一个接口:

  1. interface AddressStreetOnly {
  2. val id: Int
  3. val street: Map<Language, String>
  4. }

语言是一种枚举 enum class Language { EN, RU, KZ, TJ } 问题是我打电话的时候 findStreetByZipCode 基础sql语句在select查询中包含所有字段:

  1. select
  2. address0_.id as id1_9_,
  3. address0_.created_at as created_2_9_,
  4. address0_.street as street3_9_,
  5. address0_.updated_at as updated4_9_,
  6. address0_.zip_code as zip_cod5_9_
  7. from
  8. addresses
  9. where
  10. address0_.zip_code = ?

但如果我改变了 val street: Map<Language, String> 在addressstreetonly接口中键入 val street: Any ,一切正常:

  1. select
  2. address0_.id as col_0_0_,
  3. address0_.street as col_1_0_
  4. from
  5. addresses
  6. where
  7. address0_.zip_code = ?

我认为问题出在street字段的类型上,它是map,它迫使map获取实体的所有字段。我怎样才能解决这个问题?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题