JPA StoredProcedureQuery:传递UUID作为参数

时间:2018-05-29 13:59:42

标签: postgresql hibernate jpa mapping uuid

我使用JPA 2.1(Hibernate),Postgres 9.6,我需要将java.util.UUID作为参数传递给StoredProcedureQuery,如下所示:

StoredProcedureQuery proc = em.createStoredProcedureQuery(myProc)
        .registerStoredProcedureParameter(0, UUID.class, ParameterMode.IN)
        .registerStoredProcedureParameter(1, ...)
        .setParameter(0, myUuid)
        .setParameter(1, ...);

默认情况下,Java类型 UUID 被解释为Postgres类型 bytea ,我得到类似的内容:

ERROR: function my_function(bytea, ...) does not exist.

当然它不存在,因为我的功能是:

my_function(UUID, ...)

那么,有没有明确定义的方法,哪个数据库级类型必须用于特定参数?

可能类似于我们在带有注释的实体类中使用的那个:

@Type(type="pg-uuid")
private UUID uuid;

一个明显的解决方法是将值作为字符串传递,然后将其强制转换为函数内的 UUID ,但是......

1 个答案:

答案 0 :(得分:0)

使用EclipseLink 2.7.6和Postgres 11.8可以正常工作,我希望它也可以与Hibernate一起工作。最初,我也以“ bytea”结尾。首先,我需要这个琐碎的转换器,我不知道为什么我必须将UUID转换为UUID,但是它可以工作。

import java.util.UUID;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter(autoApply = true)
public class UUIDConverter implements AttributeConverter<UUID, UUID> {

@Override
public UUID convertToDatabaseColumn(final UUID uuid) {
    return uuid;
}

@Override
public UUID convertToEntityAttribute(final UUID uuid) {
    return uuid;
}

}

函数api是这样的:

create or replace function generate_namespace(idSubscription uuid) returns integer as 
...

请注意-我无法以托管实体的形式返回整个记录,因为JPA无法接收所有必需的元数据,并且不知道什么(以及是否)是主键,等等。因此,代替{{ 1}}我只返回它的主键,然后调用returns Namespace以获取由函数生成的托管实体:

entityManager.find