PSQLException: ERROR: operator does not exist: character varying = uuid

5

我有这个代码库:

@Repository
public interface DomainRepository extends CrudRepository<Domain, String> {
    Domain findByUuid(UUID uuid);
}

我有这个实体:

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name="a", schema="b")
public class Domain {
    @Id
    private String id;
    private UUID uuid;

}

然而,当我执行Domain d = domainRepository.findByUuid(UUID.randomUUID());时,我得到了一个PSQLException: ERROR: operator does not exist: character varying = uuid(表格中的列类型为VARCHAR)。

如何解决这个问题呢?

2个回答

3

尝试通过使用注解@Type(type="org.hibernate.type.UUIDCharType")为字段定义类型,这样Hibernate才能理解该类型。

@Type(type="org.hibernate.type.UUIDCharType")
private UUID id;

2
如果指定类型没有帮助到您,您也可以尝试类似以下的方法:
public class UUIDConverter implements AttributeConverter<UUID, String> {
    @Override
    public String convertToDatabaseColumn(UUID attribute) {
        return attribute == null ? null : attribute.toString();
    }

    @Override
    public UUID convertToEntityAttribute(String dbData) {
        return dbData == null ? null : UUID.fromString(dbData);
    }
}

并修改您的实体字段:

@Convert(converter = UUIDConverter.class)
private UUID id;

这个解决方案在每次检索实体时都会添加类型转换,并要求您为每个uuid字段放置@Convert注释,但作为解决方法,这将起作用。

还要确保数据库中的列具有varchar/text类型,否则可能会失败(如果您不想或无法将类型从uuid替换为varchar,则只需创建视图)。


@Converter(autoApply = true)有助于避免使用字段注解。 - sschrass

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接