以Postgresql JSON字段作为映射的实体的Spring Boot JPA投影<;关键、价值>;
我正在使用SpringBoot,Kotlin和PostgreSQL作为DB。对于JSON字段,我使用以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")
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 = ?