我使用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 ,但是......
答案 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