Java 如何使用@ManyToOne注释连接两个实体,其中字段为VARCHAR和BIGINT

Java 如何使用@ManyToOne注释连接两个实体,其中字段为VARCHAR和BIGINT,java,postgresql,hibernate,Java,Postgresql,Hibernate,使用Hibernate连接表时是否可以强制转换类型 我有两个@Entity类。BIGINT类型是第一个表中的主键。在第二个表中,外键是VARCHAR类型。 VARCHAR是必需的,因为主实体连接主键为字符串的表,但在其中一个表中,键为Long 对于VARCHAR类型,一切正常,但在尝试执行BIGINT查询时,它会收到一条错误消息: org.postgresql.util.PSQLException: ERROR: operator does not exist: character varyin

使用Hibernate连接表时是否可以强制转换类型

我有两个
@Entity
类。
BIGINT
类型是第一个表中的主键。在第二个表中,外键是
VARCHAR
类型。
VARCHAR
是必需的,因为主实体连接主键为
字符串的表,但在其中一个表中,键为
Long

对于
VARCHAR
类型,一切正常,但在尝试执行
BIGINT
查询时,它会收到一条错误消息:

org.postgresql.util.PSQLException: ERROR: operator does not exist: character varying = bigint
No operator matches the given name and argument type(s). You might need to add explicit type casts.
@Getter
@塞特
@实体
@审计
@表(name=“rev”)
公共阶级复仇{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
...
@未经审核
@Setter(AccessLevel.NONE)
@OneToMany(mappedBy=“rev”)
私有列表访问级别;
}

我想
bindingId
是varchar列吗?在这种情况下,您可以使用
@ColumnTransformer(forColumn=“bindingId”,read=“cast(bindingId为bigint)”)配置读取值的方式。
但我建议您添加一个始终以cast(bindingId为bigint)生成的列
存储到表中以避免性能问题。

外键列的数据类型与引用的主键不同,这是一个巨大的错误。事实上,在这种情况下,Postgres甚至不允许您创建正确的外键。解决问题的唯一明智的方法是将外键列的数据类型更改为
bigint
@Getter
@Setter
@Audited
@MappedSuperclass
public abstract class BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

...

}
@Entity
@Table(name = "access_link")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "bindingType", discriminatorType = DiscriminatorType.STRING)
public abstract class BindingAccessEntity extends BaseEntity {
}
@Getter
@Entity
@DiscriminatorValue(RevAccessEntity.DISCRIMINATOR)
@Where(clause = "binding_type='" + RevAccessEntity.DISCRIMINATOR + "'")
public class RevAccessEntity extends BindingAccessEntity {

    static final String DISCRIMINATOR = "REV";

    @ManyToOne
    @JoinColumn(name = "bindingId", insertable = false, updatable = false)
    private RevEntity rev;

}
@Getter
@Setter
@Entity
@Audited
@Table(name = "rev")
public class RevEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

...

    @NotAudited
    @Setter(AccessLevel.NONE)
    @OneToMany(mappedBy = "rev")
    private List<RevAccessEntity> accessLevel;

}