我必须将查询的bytea条目转换为bigint。怎么可以这样做?
更多信息:
我有一个hibernate存储库,如下所示 -
@Query(value = "update Sample_Table set other_id = ?1 where id = ?2", nativeQuery = true)
void saveOrUpdateOtherId(Long other_id, Long id);
Hibernate以某种方式将id
(在where子句中)作为bytea
并且因为' Sample_Table '将此id字段设为bigint
,因此它会抛出类型不匹配问题。
我尝试使用CAST将bytea
转换为bigint
,但未成功,错误信息说bytea
无法转换为bigint
。
如何将bytea
更改为bigint
?
修改
Sample_Table DAO:
@Table(name = "Sample_Table")
public class Sample{
@Id
@Column(name = "id", unique = true)
@GeneratedValue
private Long id;
@Column(name = "other_id")
private Long other_id;
}
id
字段在此定义为Long。
修改-2 如果有人遇到这样的问题,很可能他在查询中传递空值。
答案 0 :(得分:1)
除了从正确填充的十六进制字符串中传递位数据类型之外,从bytea(一块内存)转换为基本数据类型似乎不是一个简单的函数:
SELECT ('x'||lpad(encode('\001'::bytea, 'hex'), 16, '0'))::bit(64)::bigint
答案 1 :(得分:1)
您的一个参数是null
,无法转换为bigint
。
答案 2 :(得分:1)
以下表达式对我有用,可以从bytes::bytea
转换为bigint
:
get_byte(bytes, 0)::bigint << 8
| get_byte(bytes, 1) << 8
| get_byte(bytes, 2) << 8
| get_byte(bytes, 3) << 8
| get_byte(bytes, 4) << 8
| get_byte(bytes, 5) << 8
| get_byte(bytes, 6) << 8
| get_byte(bytes, 7)
这也正确处理了符号位。
答案 3 :(得分:0)
如简·尼尔森所说
您的参数之一为null,无法将其转换为bigint。
您正在尝试在查询中传递null。
答案 4 :(得分:0)
我在存储库查询中遇到了此问题,该查询插入了具有可为空列的记录。当该列的值为null时,hibernate使用错误的类型,我将在Postgres中看到类似的异常:
cannot cast type bytea to bigint
最终找到了该博客文章,并提供了解决方案:http://www.carbonrider.com/2020/08/15/org-postgresql-util-psqlexception-error-cannot-cast-type-bytea-to-uuid/
使用Hibernate的TypedParameterValue
。
复制并粘贴其摘要:
@Query("select * from user where firstname=:name and id=:id", nativeQuery=true)
public List<user> findByNameAndId(@Param("name") String firstName, @Param("id")TypedParameterValue id);
UUID userId = ... //Retrived from request parameter.
TypedParameterValue userIdParam = new TypedParameterValue(new PostgresUUIDType(), userId);
userRepository.findByNameAndId(userName, userIdParam);
使用特定于Hibernate的解决方案而不是纯粹的JPA解决方案不是理想的选择,而是?♂️。非常感谢“ Carbon Rider”或添加该帖子的人!