实体的 Spring Boot JPA 投影,Postgresql JSON 字段为 Map<Key, Value>

问题描述

我使用带有 Kotlin 和 Postgresql 作为数据库的 Spring Boot。对于 JSON 字段,我使用 hibernate-types-52:

dependencies {
    ...
    implementation("com.vladmihalcea:hibernate-types-52:2.10.2")
    ...
}

我有一个带有街道 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,}

对应的仓库是:

@Repository
interface AddressRepository : JpaRepository<Address,Int> {

    fun findStreetByZipCode(zipCode: String): Addressstreetonly?
}

其中 Addressstreetonly 是一个接口:

interface Addressstreetonly {
    val id: Int
    val street: Map<Language,String>
}

和 Language 是一个枚举 enum class Language { EN,RU,KZ,TJ }

问题是当我调用 findStreetByZipCode 时,底层 sql 语句在选择查询中具有所有字段

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 = ?

但如果我将 Addressstreetonly 接口中的 val street: Map<Language,String> 类型更改为 val street: Any,一切都会按预期进行:

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

我认为问题出在街道字段的类型上,即 Map 并且 Map 强制获取实体的所有字段。我该如何解决这个问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...