我有一个实体类,其中一个字段用 @ColumnTransformer 注释
@NotNull
@Column(name = "CURRENCY_CODE_ID")
@ColumnTransformer(
read = "(SELECT cc.code FROM currency_code AS cc WHERE cc.currency_code_id = currency_code_id)",
write = "(COALESCE((SELECT cc.currency_code_id FROM currency_code AS cc WHERE cc.code = ?),0))")
public String currency;
在 hibernate 5.2.12 中它运行良好,但是在升级到 Hibernate 5.3.4.Final 之后它突然崩溃并且我正在生成以下查询
campaign0_.campaign_group_id as campaign3_33_,
(SELECT cc.code FROM public.currency_code AS cc
WHERE cc.campaign0_.currency_code_id = campaign0_.currency_code_id) as currency4_33_,
campaign0_.date_created as date_cre5_33_,
所以在 where 子句中 cc.currency_code_id = currency_code_id 被替换为 cc.campaign0_.currency_code_id 。所以基本上生成的表名 campaign0_ 被注入(inject)到表的别名和列名之间。不确定它是如何发生的以及解决方法是什么。我确实进行了搜索,但到目前为止一无所获。
迁移指南中也没有提到 - https://github.com/hibernate/hibernate-orm/blob/5.3/migration-guide.adoc
最佳答案
最后,经过大量调试和研究,我找到了为 5.* 版本系列报告的错误 - https://hibernate.atlassian.net/browse/HHH-8944?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel
看起来我必须使用 forColumn 配置,我试过了,它起作用了,但有点奇怪。从多个组合大写工作
@NotNull
@Column(name = "CURRENCY_CODE_ID")
@ColumnTransformer(
forColumn = "CURRENCY_CODE_ID",
read = "(SELECT cc.code FROM currency_code AS cc WHERE cc.CURRENCY_CODE_ID = currency_code_id)",
write = "(COALESCE((SELECT cc.currency_code_id FROM currency_code AS cc WHERE cc.code = ?),0))")
public String currency;
如您所见,我将 forColumn = "CURRENCY_CODE_ID"添加为大写,并将 cc.CURRENCY_CODE_ID 引用为大写,因此它跳过了它。所以行为仍然有点古怪 m 但在列表中有效,
生成的结果是
(SELECT
cc.code
FROM
public.currency_code AS cc
WHERE
cc.CURRENCY_CODE_ID = campaign0_.currency_code_id) as currency4_33_,
这也有效,所以看起来像大写问题。女巫救了我
@NotNull
@Column(name = "currency_code_id")
@ColumnTransformer(
forColumn = "currency_code_id",
read = "(SELECT cc.code FROM currency_code AS cc WHERE cc.CURRENCY_CODE_ID = currency_code_id)",
write = "(COALESCE((SELECT cc.currency_code_id FROM currency_code AS cc WHERE cc.code = ?),0))")
public String currency;
关于java - 从 5.2.12 升级到 hibernate 5.3.4 后,Hibernate ColumnTransformer 停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51731829/