如何解决UUID主键未按标准存在的方式按预期映射
我正在尝试将UUID用作实体的主键,其中BINARY(16)是其在mysql数据库中的表示形式。
例如,我拥有的UserId是UUID:
//the column definition in the Entity
@Id
@Column(name="user_id",columnDefinition = "BINARY(16)")
@ColumnTransformer(
read="bin_to_uuid(user_id)",write="uuid_to_bin(?)")
private UUID userId;
//repository methods
@Transactional
@Modifying
@Query("UPDATE User u SET u.status = :status WHERE u.userId= :id ")
int updateUserStatus(@Param("id") UUID id,@Param("status") UserStatus status);
@Query("SELECT count(u) from User u WHERE u.userId= bin_to_uuid(:id)")
int existsByUserId(@Param("id") UUID id);
但是,请注意,在existByUserId中,我必须添加bin_to_uuid(:id)而不是直接比较。我不太明白为什么必须这样做,我通过直接查看数据库中的查询找到了解决方法,并提出了解决方案。更新查询不会添加bin_to_uuid,而选择计数会添加。标准的existById实现也不适用于UUID ..
我对此有其他代码:
public void updateUserStatus(UUID id,int status) throws UserNotFoundException {
int rowsUpdated = userRepository.updateUserStatus(id,UserStatus.values()[status]);
if (rowsUpdated == 0) {
throw new UserNotFoundException(id);
}
}
public List<User> getFollowedBloggersByUser(UUID id,Pageable p) throws UserNotFoundException {
if (userRepository.existsByUserId(id) == 0) {
throw new UserNotFoundException(id);
} else {
return userFollowRepository.findByFollowerId(id,p);
}
}
我不明白这两个查询之间的区别。但是在DEBUG模式下的日志中的查询是:
update users set status=? where user_id=?
binding parameter [1] as [INTEGER] - [1]
binding parameter [2] as [BINARY] - [420090c1-1a28-11eb-b98e-00155d2849a9]
select count(1) as col_0_0_ from users user0_ where bin_to_uuid(user0_.user_id)=bin_to_uuid(?)
binding parameter [1] as [BINARY] - [9e9eeb09-6a6d-405d-abd6-802c9c2c811d]
mysql常规日志显示如下:
update users set status=1 where user_id=x'420090C11A2811EBB98E00155D2849A9'
select count(1) as col_0_0_ from users user0_ where bin_to_uuid(user0_.user_id)=bin_to_uuid(x'9E9EEB096A6D405DABD6802C9C2C811D')
如果有人可以指出我的意思或显示更好的方法,我将不胜感激。谢谢!
解决方法
对于后代,事实证明列转换器的读取部分是绝对冗余的,并且会产生上述问题。 JPA 绝对能够正确地将 uuid 显示为字符串。所以你只需要用 write 属性创建 columntransformer:
@ColumnTransformer(write="uuid_to_bin(?)")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。