Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何查询数据库(JPA/Hibernate/MySQL)中以二进制形式存储的UUID_Hibernate_Jpa_Binary_Uuid - Fatal编程技术网

如何查询数据库(JPA/Hibernate/MySQL)中以二进制形式存储的UUID

如何查询数据库(JPA/Hibernate/MySQL)中以二进制形式存储的UUID,hibernate,jpa,binary,uuid,Hibernate,Jpa,Binary,Uuid,我有一个基于Java/JPA/Hibernate/MySQL的应用程序。我希望将UUID用于对象标识,但我希望确保数据库性能不会受到影响 我发现了这篇很棒的博客文章,它让我走到了那里。请注意,UUID的存储是如何通过以二进制形式存储(相对于字符串表示)来优化的 它解决了部分问题,因为现在我们可以高效地将对象插入数据库 但是,现在当我想使用EntityManager.createQuery从数据库中查询时,我遇到了一个问题。是否可以/需要查询二进制数据?或者,我是否应该将字符串UUID存储在二进制

我有一个基于Java/JPA/Hibernate/MySQL的应用程序。我希望将UUID用于对象标识,但我希望确保数据库性能不会受到影响

我发现了这篇很棒的博客文章,它让我走到了那里。请注意,UUID的存储是如何通过以二进制形式存储(相对于字符串表示)来优化的

它解决了部分问题,因为现在我们可以高效地将对象插入数据库


但是,现在当我想使用EntityManager.createQuery从数据库中查询时,我遇到了一个问题。是否可以/需要查询二进制数据?或者,我是否应该将字符串UUID存储在二进制版本旁边以方便查询?

10亿条记录上的16字节开销大约为15Gb。如果您确实有那么多的数据a您将需要解决更严重的可扩展性问题,而10美分/Gb或更低的15Gb也不是什么大问题。多对多关系可以更快地发展到这个规模,但仍然不需要太担心

总而言之,只需使用字符串表示法,它将以相当低的价格为您节省大量处理数据库的工作


另外,我个人的偏好是使用数字ID,但这是单独的讨论。

只要您已经拥有二进制格式的ID,查询它就很简单:

byte[] id = ....;
em.createQuery(“SELECT x FROM TableName x WHERE x.id = ?1″, TableName.class).setParameter(1, id).getSingleResult();
实际上,如果您只是通过主键查找,您可以使用

em.find(TableName.class, id);

以二进制格式获取ID可能有点麻烦,尤其是如果需要在URL等中传递ID。我建议对其进行Base64编码/解码;Apache Commons Codec具有从字节[]到URL安全字符串再返回到字节[]的帮助方法通过Hibernate 4.1.2和MySQL-Connector-J 5.1.18测试,您可以定义UUID字段:

@Entity
class EntityType {
    @Column( columnDefinition = "BINARY(16)", length = 16 )
    private UUID id;
}
…并使用UUID实例进行查询:

UUID id = ....;
EntityType result = em.createQuery( 
   “SELECT x FROM EntityType x WHERE x.id = ?1″, EntityType.class )
   .setParameter( 1, id ).getSingleResult();

你有没有衡量过这个技巧应该带来的性能改进?我真的不会这么做,因为应用程序将更难调试,数据库也更难从Java和外部查询。如果你想要高效的密钥,为什么不使用数字呢?谢谢Robert(再次!)我们将id作为UUID字符串EntityManager()分发。find(TestEntity.class,convert(id))public static byte[]convert(String uuidAsString){UUID u=UUID.fromString(uuidAsString);ByteBuffer bb=ByteBuffer.allocate(16);bb.putLong(u.getmosignificantbits()).putLong(u.getLeastSignificantBits());return bb.array();}Alex-存储不是我关心的问题。事务性能是。我正在探索使用基于16字节UUID的PK是否比基于36字节字符串的UUID具有显著的性能优势。