FindByUUID()使用Spring Data的JPA存储库

ny6fqffe  于 12个月前  发布在  Spring
关注(0)|答案(4)|浏览(168)

由于某种原因,我无法找到一个合适的答案。我有以下简单的实体:

@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;
  }
}

字符串
Spring Data JPA with Hibernate在我的MySQL数据库中正确创建了所有内容。然而,当我尝试使用我的JPARepository实现使用其uuid搜索一个项目时,它永远不会找到任何东西,即使它在DB上执行find查询(我可以在我的调试器中看到)。这是我的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);
}


我错过了什么吗?
谢谢你的帮助!

ee7vknir

ee7vknir1#

尝试使用@org.hibernate.annotations.Type(type="org.hibernate.type.UUIDCharType")注解您的UUID属性

@org.hibernate.annotations.Type(type="org.hibernate.type.UUIDBinaryType")
我在使用UUID查询数据库时遇到了一个类似的问题,因为在二进制格式中使用UUID进行MSB/LSB交换;我们解决了将数据视为String的问题,并在转换之前进行了必要的转换。

5us2dqdw

5us2dqdw2#

将二进制列更改为字符串默认值为二进制您必须添加此附加符号

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

字符串
Eg.

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

bvjxkvbb

bvjxkvbb3#

我最近处理了同样的问题,如果有人在这里绊倒了,对我来说,解决方案是用

@Column(name = "id", columnDefinition = "BINARY(16)")
private UUID id;

字符串
这解决了我的问题。

w6mmgewl

w6mmgewl4#

有同样的问题,特别是它在H2中工作,但在MySQL中不工作。
此外,我在尝试更新记录时遇到了PRIMARY键约束失败,因为Hibernate(在JPA下)正在查询记录是否存在,但它没有找到它。
使用@Column(length=16)也很好地解决了这个问题,假设MySQL使用的是BINARY列.否则匹配会失败,因为该列在DB中有额外的数据(我认为它默认为BINARY[32])。

相关问题