使用Spring Data的JPA Repository查找UUID()

7

出于某些原因,我一直没有找到一个合适的答案。我有以下简单实体:

@Entity
@Table(name = "simple_entity")
@Access(AccessType.FIELD)
public class SimpleEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  protected Long id;

  @Column(unique = true, updatable = false)
  protected UUID uuid;

  @PrePersist
  protected void onCreateAbstractBaseEntity() {
      this.uuid = UUID.randomUUID();
  }

  public Long getId() {
      return this.id;
  }

  public UUID getUuid() {
      return this.uuid;
  }
}

使用Hibernate的Spring Data JPA在我的MySQL数据库中创建了一切。然而,当我尝试使用我的JPARepository实现通过uuid搜索项目时,它从来没有找到任何东西,即使它在数据库中执行了查找查询(我可以在调试器中看到)。以下是我的JPARepository实现:

public interface SimpleEntityRepository extends JpaRepository<SimpleEntity, Long> {
      SimpleEntity findOneByUuid(UUID uuid);
}

这是调用此方法的控制器。
@Controller
@RequestMapping("/simple_entity")
public class SimpleEntityController {

@Autowired
private SimpleEntityRepository repository;

@RequestMapping(method = RequestMethod.GET, value = "/{simpleEntityId}", produces =        MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<FileDatastore> getSimpleEntity(@PathVariable UUID simpleEntityId)     {
    SimpleEntity record = this.repository.findOneByUuid(simpleEntityId);
    HttpHeaders headers = new HttpHeaders();

    HttpStatus status = (record != null) ? HttpStatus.OK : HttpStatus.NOT_FOUND;

    return new ResponseEntity<>(record, headers, status);
}

我有点不明白,还有什么需要注意的吗?

感谢您的帮助!


请展示您的实现以及调用该方法的相关代码。 - DannyMo
5个回答

14

尝试使用@org.hibernate.annotations.Type(type="org.hibernate.type.UUIDCharType")或者@org.hibernate.annotations.Type(type="org.hibernate.type.UUIDBinaryType")注释您的UUID属性以解决查询数据库时由于UUID二进制格式中MSB/LSB交换而导致的类似问题;我们解决了这个问题,将数据视为字符串并在转换之前进行必要的转换操作。


你的意思是用这个来注释受保护的UUID uuid;字段吗? - Manuel Ortiz Bey

6

将二进制列更改为字符串。默认为二进制,您必须添加此注解。


@Type(type="org.hibernate.type.UUIDCharType")

举例:

@Id
@GeneratedValue
@Type(type="org.hibernate.type.UUIDCharType")
public UUID id;

1
我最近也遇到了同样的问题,如果有人在这里遇到了困难,对我来说解决方案是用注释标记该列。
@Column(name = "id", columnDefinition = "BINARY(16)")
private UUID id;

这对我解决了问题。

1

我曾经遇到过同样的问题,具体来说是在H2数据库中可以工作,但在MySQL中无法工作。

此外,当我尝试更新记录时,由于Hibernate(在JPA下)查询以查看记录是否存在并且没有找到它,因此出现了主键约束失败的情况。

使用@Column(length=16)也可以很好地解决这个问题,假设MySQL正在使用BINARY列...否则,由于列在DB中有额外的数据(我认为默认为BINARY[32]),匹配将失败。


0
我也有同样的问题。 在我的情况下,这个问题出现在MySQL中,而不是在PostgreSQL中。
正如有人已经提到的,在UUID类型的列中存在额外的二进制数据(这给我们带来了不匹配或空值)link
如果findBy任何uuid不起作用。
选项-1
@Type(type="org.hibernate.type.UUIDCharType")

选项-2
@Column(name = "id" ,  columnDefinition = "BINARY(16)")

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