Hibernate 以错误的数据类型提取值
Hibernate extracts value in wrong data type
我在下面有 2 个实体 Brand 和 BrandMerchantDefinition。在 ACQ_BRAND table 的 brand_code 列中,我有 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
?
连接列引用了主键,即实体的id列。这被指定为 Long
因此 BIGINT
听起来是一个合理的选择。
如果要处理成String
/VARCHAR
需要把主键属性改成String
.
我在下面有 2 个实体 Brand 和 BrandMerchantDefinition。在 ACQ_BRAND table 的 brand_code 列中,我有 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
?
连接列引用了主键,即实体的id列。这被指定为 Long
因此 BIGINT
听起来是一个合理的选择。
如果要处理成String
/VARCHAR
需要把主键属性改成String
.