微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决实体的 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.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?