在我的表中,我有如下名称的列:price_year_2023_eur
,date_added
,yet_another_column_2
,…。在kotlin
端,我希望能够使用camelCase
列名。因此,我正在尝试转换列名称。
// kotlin
@Entity
@Table(name = "foo")
class Project(
@Column var priceYear2023Eur : String = "",
@Column var dateAdded: Int = 1,
@Column var name: String = "",
@Column var yetAnotherColumn2: Double = 0.0,
)
字符串
我创建了一个类(基于此),其中扩展了convertToSnakeCase()
以包含数字。
class CustomPhysicalNamingStrategy {
fun toPhysicalCatalogName(identifier: Identifier, jdbcEnv: JdbcEnvironment?): Identifier? {
return convertToSnakeCase(identifier)
}
fun toPhysicalColumnName(identifier: Identifier, jdbcEnv: JdbcEnvironment?): Identifier? {
return convertToSnakeCase(identifier)
}
fun toPhysicalSchemaName(identifier: Identifier, jdbcEnv: JdbcEnvironment?): Identifier? {
return convertToSnakeCase(identifier)
}
fun toPhysicalSequenceName(identifier: Identifier, jdbcEnv: JdbcEnvironment?): Identifier? {
return convertToSnakeCase(identifier)
}
fun toPhysicalTableName(identifier: Identifier, jdbcEnv: JdbcEnvironment?): Identifier? {
return convertToSnakeCase(identifier)
}
private fun convertToSnakeCase(identifier: Identifier): Identifier? {
val regexCamelCase = "([a-z])([A-Z])".toRegex()
val regexNumber = """([a-zA-Z])(\d)""".toRegex()
val replacement = "$1_$2"
val newNameLetters: String = identifier.text
.replace(regexCamelCase, replacement)
.lowercase()
val newNameNumbers: String = newNameLetters
.replace(regexNumber, replacement)
.lowercase()
return Identifier.toIdentifier(newNameNumbers)
}
}
型
我添加到application.properties
文件中的这个类如下所示
hibernate.physical_naming_strategy=org....utils.CustomPhysicalNamingStrategy
型
但是我得到了
org.postgresql.util.PSQLException:您访问的页面不存在!也许你想引用列“p1_0.price_year_2023_eur”。
有些东西是不工作的转换,我不确定为什么。
3条答案
按热度按时间2w2cym1i1#
如果你正在使用Hibernate,那么你可以使用
@Column
注解的name
属性,就像你在@Table
中做的那样。例如,在字符串
e7arh2l62#
如果你想从camelCase转换为snake_case,你必须设置:
字符串
如果你想使用你自己的:
型
请不要在 hibernate 前有spring.jpa...
最后,
CustomPhysicalNamingStrategy
必须从Hibernate实现PhysicalNamingStrategy
。o2g1uqev3#
有两个问题。在Sping Boot 3和Hibernate 6中,
application.properties
必须如下所示字符串
请注意,physical-strategy 使用
CustomPhysicalNamingStrategy
,而不是附带的CamelCaseToUnderscoresNamingStrategy