以Postgresql JSON字段作为映射的实体的Spring Boot JPA投影<;关键、价值>;

以Postgresql JSON字段作为映射的实体的Spring Boot JPA投影<;关键、价值>;,postgresql,spring-boot,spring-data-jpa,hibernate-types,Postgresql,Spring Boot,Spring Data Jpa,Hibernate Types,我正在使用SpringBoot,Kotlin和PostgreSQL作为DB。对于JSON字段,我使用hibernate-types-52: dependencies { ... implementation("com.vladmihalcea:hibernate-types-52:2.10.2") ... } 我有一个带有street JSON字段的实体地址: @Entity @Table(name = "addresses")

我正在使用SpringBoot,Kotlin和PostgreSQL作为DB。对于JSON字段,我使用
hibernate-types-52

dependencies {
    ...
    implementation("com.vladmihalcea:hibernate-types-52:2.10.2")
    ...
}
我有一个带有street JSON字段的实体地址:

@Entity
@Table(name = "addresses")
@TypeDefs(
  TypeDef(name = "jsonb", typeClass = JsonBinaryType::class),
  TypeDef(name = "json", typeClass = JsonStringType::class),
)
data class Address(

  @Id
  var id: Int? = null,

  @Type(type = "jsonb")
  @Column(name = "street", columnDefinition = "json", nullable = false)
  var street: Map<Language, String>,
    
  @Column(name = "zip_code" nullable = false)
  var zipCode: String,

  @Column(name = "created_at", nullable = false, updatable = false)
  @CreationTimestamp
  var createdAt: Date? = null,

  @Column(name = "updated_at", nullable = false)
  @UpdateTimestamp
  var updatedAt: Date? = null,
}
但是,如果我将AddressStreetOnly界面中的
val street:Map
类型更改为
val street:Any
,则一切正常:

select
    address0_.id as col_0_0_,
    address0_.street as col_1_0_
from
    addresses
where
    address0_.zip_code = ?

我认为问题在于街道字段的类型,它是Map,它迫使Map获取实体的所有字段。如何解决此问题?

如果您自己指定查询,会发生什么情况?所以类似于
@Query(“从地址a中选择一个.zip_代码,地址a较低(a.zip_代码)类似于较低(:zipCode)”)的有趣的findStreet(zipCode:String):AddressStreetOnly?
@jipharthorn是的,在这种情况下它会按预期工作。若我在select中只显示必需的字段,它将生成正确的SQL语句。问题是,我不想每次都通过
@Query
编写查询,因为在一些简单的情况下,可以使用JPA方法命名方法编写查询。好吧,不幸的是,我不知道怎么做
interface AddressStreetOnly {
    val id: Int
    val street: Map<Language, String>
}
select
    address0_.id as id1_9_,
    address0_.created_at as created_2_9_,
    address0_.street as street3_9_,
    address0_.updated_at as updated4_9_,
    address0_.zip_code as zip_cod5_9_
from
    addresses
where
    address0_.zip_code = ?
select
    address0_.id as col_0_0_,
    address0_.street as col_1_0_
from
    addresses
where
    address0_.zip_code = ?