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);
我想在数据库中查询给定的非主 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);