gpt4 book ai didi

java - Oracle 中 CHAR 主键列的 hibernate 和填充

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:29:20 24 4
gpt4 key购买 nike

我在将 Hibernate 与 Oracle 中的 char(6) 列一起使用时遇到了一些麻烦。这是表的结构:

CREATE TABLE ACCEPTANCE
(
USER_ID char(6) PRIMARY KEY NOT NULL,
ACCEPT_DATE date
);

对于用户 ID 少于 6 个字符的记录,我可以在使用 SQuirreL 运行查询时选择它们而无需填充用户 ID。 IE。如果存在用户 ID 为“abc”的记录,则以下返回一条记录。

select * from acceptance where user_id = "abc"

不幸的是,当通过 Hibernate (JPA) 进行选择时,以下返回 null:

em.find(Acceptance.class, "abc");

如果我填充值,它会返回正确的记录:

em.find(Acceptance.class, "abc   ");

我正在处理的模块从系统的其他部分获取未填充的用户 ID。除了在将用户 ID 提供给 Hibernate 之前将其调整为一定长度之外,是否有更好的方法让 Hibernate 工作? (如果长度发生变化,可能会出现维护问题)

最佳答案

这是上帝告诉你永远不要使用 CHAR() 作为主键的方式:-)

然而,严重的是,由于您的 user_id 在您的实体中被映射为字符串,Hibernate 的 Oracle 方言将其转换为 varchar。由于 Hibernate 对其所有查询都使用准备好的语句,因此语义得以延续(与 SQuirreL 不同,在 SQuirreL 中,值被指定为文字,因此转换方式不同)。

基于 Oracle type conversion rules然后将列值提升为 varchar2 并进行比较;因此你得不到任何记录。

如果您不能更改基础列类型,最好的选择可能是使用 HQL 查询和 Oracle 方言支持的 rtrim() 函数。

关于java - Oracle 中 CHAR 主键列的 hibernate 和填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1909483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com