如何在数据库中查询存储为二进制文件的UUID(JPA / Hibernate / MySQL)

时间:2011-07-08 18:57:27

标签: hibernate jpa binary uuid

我有一个基于Java / JPA / Hibernate / MySQL的应用程序。我想使用UUID作为对象标识,但是我想确保数据库性能不受影响。

我发现这篇精彩的博客JPA and UUID Primary Keys让我有了一些方法。注意如何通过以二进制形式存储UUID来优化UUID的存储(相对于字符串表示。

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

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

3 个答案:

答案 0 :(得分:8)

使用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();

答案 1 :(得分:0)

只要您已经拥有二进制格式的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等中传递它。我建议使用Base64编码/解码它; Apache Commons Codec有一些辅助方法,从byte []到URL安全字符串然后再返回byte []

答案 2 :(得分:-1)

10亿条记录的16字节开销大约为15Gb。如果您确实拥有大量数据,那么您将需要解决更严重的可扩展性问题,那些10美分/ Gb或更低的15Gb并不是什么大不了的事。许多关系可以更快地增长到那么大,但仍然没有那么多担心。

总结一下,只需使用字符串表示。它将以相当低的价格为您节省大量精力处理数据库。

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