Spring 启动 JPA findByUuid

Spring boot JPA findByUuid

我想在数据库中查询给定的非主 UUID key.I 无法正常工作:

这是我的节点 class。我的 PK 是一个长自动增量,我有一个名为 uuid 的字段,用于存储在数据库中保存新节点时生成的 UUID 密钥。

更新:即使我通过 id 获取一个节点,然后使用其节点 uuid 调用 findByUuid 函数,我也得到一个空值

    Node n = nodeService.getNodeByNodeId(1L);
    return nodeService.getNodeByNodeUuid(n.getApiKey());

节点

@Entity
@Table(name="node")
public class Node {

@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.AUTO, generator = "node_seq")
@SequenceGenerator(name = "node_seq", sequenceName = "node_seq", allocationSize = 1)
private Long id;

@Column(name = "uuid", updatable = false, nullable = false, unique=true)
private UUID uuid;


public UUID getUuid() {
    return uuid;
}

public void setUuid(UUID uuid) {
    this.uuid = uuid;
}

@Column(name = "NAME", length = 50, unique = true)
@NotNull    
private String name;

@OneToMany(mappedBy="node", cascade=CascadeType.ALL)
private List<User> users;

public List<User> getUsers() {
    return users;
}

public void setUsers(List<User> users) {
    this.users = users;
}
public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

}

控制器

    @PreAuthorize("hasRole('MANAGER')")
    @RequestMapping(value="/node/{nodeUuidString}", method = RequestMethod.GET)
    public Node getNodeByUuid(@PathVariable UUID nodeUuidString) {
       return nodeService.getNodeByNodeUuid(nodeUuidString);
}

我还将 nodeUuidString 作为字符串获取,然后使用以下方法转换为 UUID:

UUID nodeUuid = UUID.fromString(nodeUuidString);

但是没有用。

服务

    public Node getNodeByNodeUuid(UUID nodeUuid) {
       return nodeRepository.findOneByUuid(nodeUuid);
}

存储库

@Repository
public interface NodeRepository extends CrudRepository<Node, Long> {

Node findOneByUuid(UUID nodeUuid);

}

如果没有任何效果,请编写您自己的查询:

@Query("SELECT n FROM Node n WHERE n.uuid= ?1")
Node findOneByUuid(UUID nodeUuid);

Spring 在数据库中将字段创建为 binary(255)

正确的是二进制(16)

因此,为了使查询正常工作,我必须在实体定义上使用此注释:

@Column(name = "apiKey", updatable = false, nullable = false, unique=true, columnDefinition = "BINARY(16)")

其背后的原因是默认情况下 hibernate 将 UUID 转换为 BINARY(255) 255 作为默认长度值。 UUID的大小实际上是BINARY(16)。因此在比较时导致不匹配。

解决方案是使用指定列的长度,如下所示

@Column(length=16)
UUID uuid;

注意:如果您使用的 sql 数据库不是由 spring 生成的,则必须更改 id 列

alter table table_name modify column uuid binary(16);