首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何利用动态SQL对MySQL二进制UUID进行比较

如何利用动态SQL对MySQL二进制UUID进行比较
EN

Stack Overflow用户
提问于 2022-12-01 08:35:42
回答 1查看 23关注 0票数 0

我们将其中一个UUID值作为binary(16)存储在mysql中。

等级库

代码语言:javascript
复制
 MyTable myTable = new MyTable();` //table
 SqlColumn<Long> id = column("id");` // id column
 SqlColumn<UUID> myUuidColumn = column("my_uuid");` //uuid column

select的动态sql查询。

代码语言:javascript
复制
            select(myTable.id)
                .from(myTable)
                .where(myTable.myUuidColumn, isEqualTo(UUID.fromString("e59bf2fd-e742-4314-ab02-db195e0168c8")))
                .build()
                .render(RenderingStrategies.MYBATIS3);

但是这是不起作用的,可能是因为UUID没有被本地支持。除了将映射程序更改为使用普通sql查询外,如何修复此问题?

EN

回答 1

Stack Overflow用户

发布于 2022-12-01 09:20:06

您需要编写自定义类型处理程序。

实现取决于驱动程序和/或列类型。

下面是用于使用的类型处理程序实现(即BINARY(16))。

代码语言:javascript
复制
import java.nio.ByteBuffer;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.UUID;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;

@MappedJdbcTypes(JdbcType.BINARY)
public class UuidTypeHandler extends BaseTypeHandler<UUID> {
  @Override
  public void setNonNullParameter(PreparedStatement ps, int i, UUID parameter, JdbcType jdbcType) throws SQLException {
    ps.setBytes(i, uuidToBytes(parameter));
  }

  private static byte[] uuidToBytes(UUID uuid) {
    ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
    bb.putLong(uuid.getMostSignificantBits());
    bb.putLong(uuid.getLeastSignificantBits());
    return bb.array();
  }

  @Override
  public UUID getNullableResult(ResultSet rs, String columnName) throws SQLException {
    return bytesToUuid(rs.getBytes(columnName));
  }

  @Override
  public UUID getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
    return bytesToUuid(rs.getBytes(columnIndex));
  }

  @Override
  public UUID getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    return bytesToUuid(cs.getBytes(columnIndex));
  }

  private static UUID bytesToUuid(byte[] bytes) {
    if (bytes == null) {
      return null;
    }
    ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);
    Long high = byteBuffer.getLong();
    Long low = byteBuffer.getLong();
    return new UUID(high, low);
  }
}

要在全局注册类型处理程序..。

如果使用的是application.properties.

  • if,则在中指定mybatis.type-handlers-package,而不是使用SqlSessionFactoryBean.的spring、设置typeHandlersPackagetypeHandlers属性。

如果由于某些原因无法在全局注册类型处理程序,则在初始化SqlColumn<UUID> myUuidColumn时可能必须传递类型处理程序的完全限定名称。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74638982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档