【问题标题】:Hibernate extracts value in wrong data typeHibernate 提取错误数据类型的值
【发布时间】:2018-12-04 17:01:28
【问题描述】:

我在下面有 2 个实体 Brand 和 BrandMerchantDefinition。在 ACQ_BRAND 表的品牌代码列中,我有 00021,00022 等数据(大多以零开头)。

@Entity
@Table(name = "ACQ_BRAND", schema = "ACQ")
public class BrandEntity {

    @Id
    @SequenceGenerator(name = "SEQ_ACQ_BRAND", sequenceName = "SEQ_ACQ_BRAND", allocationSize = 1)
    @GeneratedValue(strategy = SEQUENCE, generator = "SEQ_ACQ_BRAND")
    private Long id;
    @Version
    private Long version;
    private String corporationCode;
    private String brandCode;
    private String brandDescription;
    private String status;

    @OneToMany(mappedBy = "brandCode", cascade = {CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.LAZY)
    private List<BrandMerchantDefinitionEntity> brandMerchantDefinitionEntities;
}

它们在brand_code 列中加入。

@Entity
@Table(name = "ACQ_BRAND_MERCHANT_DEFINITION", schema = "ACQ")

public class BrandMerchantDefinitionEntity {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_ACQ_BRAND_MERCHANT_DEFINITION")
@SequenceGenerator(sequenceName = "SEQ_ACQ_BRAND_MERCHANT_DEFINITION", name = "SEQ_ACQ_BRAND_MERCHANT_DEFINITION", allocationSize = 1)
private Long id;

@Version
@Column(name = "VERSION")
private Long version;

@Column(name = "STATUS")
private String status;


@ManyToOne(fetch = FetchType.EAGER, targetEntity = BrandEntity.class)
@JoinColumn(name = "BRAND_CODE", insertable = false, updatable = false, columnDefinition= "VARCHAR2(10)")
private BrandEntity brandCode;

@Column(name = "STORE_CODE")
private String storeCode;

@Column(name = "CITY_NAME")
private String cityName;

}

我正在尝试使用brand_code = '00046' 查找实体。问题是,即使brand_code 列定义为String,(以及数据库中的varchar2(10))hibernate 将其提取为BIGINT

这里是生成的sql:

    Hibernate: 
    /* dynamic native SQL query */ select
        a.* 
    from
        acq_brand_merchant_definition a,
        acq_brand b 
    where
        a.brand_code = b.brand_code 
        and a.brand_code =?
2018-12-04 18:39:15.940 TRACE 1640 --- [nio-8090-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [VARCHAR] - [00046]
2018-12-04 18:39:16.140 TRACE 1640 --- [nio-8090-exec-1] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([id] : [BIGINT]) - [2]
2018-12-04 18:39:16.285 TRACE 1640 --- [nio-8090-exec-1] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([address] : [VARCHAR]) - [Adres]
2018-12-04 18:39:16.293 TRACE 1640 --- [nio-8090-exec-1] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([brand_code] : [BIGINT]) - [46]
2018-12-04 18:39:16.299 TRACE 1640 --- [nio-8090-exec-1] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([city_name] : [VARCHAR]) - [55]

有趣的是,city_name 是另一个带有VARCHAR2 的列,其中包含数字。但开头不包含零,提取为VARCHAR

如何强制 Hibernate 将 VARCHAR2 值提取为 String

【问题讨论】:

  • 您的 JoinColumn 带有 BRAND_CODE,但 BrandEntity 的主键是 Long。为什么?
  • @JoinColumn(name = "BRAND_CODE") 表示ACQ_BRAND_MERCHANT_DEFINITION 表必须有BRAND_CODE 列。默认情况下,@JoinColumns 映射到被引用表的主键(本例中为ACQ_BRAND)。由于被引用表的主键是数字,所以引用表中的外键也是数字。由于您希望外键引用不是被引用表中主键的列,因此您必须将此信息提供给 JPA 提供程序。 @JoinColumn(name = "BRAND_CODE", referencedColumnName = "BRAND_CODE") 将解决问题。

标签: hibernate jpa spring-data-jpa jpql


【解决方案1】:

join 列引用主键,即实体的 id 列。这被指定为Long,因此BIGINT 听起来是一个合理的选择。

如果你想被处理为String/VARCHAR你需要将主键属性更改为String

【讨论】:

    猜你喜欢
    • 2022-10-05
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    相关资源
    最近更新 更多