当前位置: 首页 > 知识库问答 >
问题:

有没有办法让Hibernate在查询时将uniQUEIDENTIFIER类型数据转换为H2 DB的String?

徐秋月
2023-03-14

我们将H2 DB用于集成测试/本地开发,将Azure SQL Server用于后台环境。在某些情况下,对SQL Server运行良好的查询对H2 DB不起作用,反之亦然。

其中一个实例是在SQL Server中为UUID type列使用uniqueidentifier数据类型时。JPA/Hibernate与uniqueidentifier数据类型兼容,并与Java很好地映射。util。UUID类型。保存时,UUID以UUID格式正确存储。在获取时(选择查询),UUID作为字符串返回,可以将其转换为具有UUID的UUID。fromString()API。

但H2 DB不是这种情况。Hibernate自动为Java.util.UUID属性创建类型为二进制(255)的列。在保存时,UUID以非UUID格式(十六进制格式)存储。在获取(选择查询)时,它以Byte[]的形式出现。

因此,当您尝试将查询结果集转换为Java对象时,代码会中断。

我们尝试在Entity中UUIDtype属性上使用@Col列注释。通过此更改,现在列的数据类型已更改为unique标识符。但是,在获取时,Hibernate仍然将其转换为Byte[]。

实体:

@ToString
@Table(name="TASK")
public class Task {
    @Id
    @Column(columnDefinition = "UNIQUEIDENTIFIER")
    private UUID id;
    private String name;
} 

查询

        Query query = entityManager.createNativeQuery("SELECT id, name from task where id=?");
        query.setParameter(1,id);
        List<Object[]> resultList = query.getResultList();
        Task task = null;
        for (Object[] row: resultList) {
            Integer rowIndex =0;
                                                    /***Code fails here***/
            task = Task.builder().id(UUID.fromString((String) row[rowIndex])).name((String) row[rowIndex+1]).build();
        }

其他详情:

H2 version: 1.4.200
Hibernate version: 5.4.28.Final

我想知道是否有更好的方法来处理这个问题?还是我在实现中遗漏了什么?

共有1个答案

丁星火
2023-03-14

为什么使用本机查询?只需使用JPQL/HQL查询:

TypedQuery<Task> query = entityManager.createQuery("SELECT t from Task 
 t where t.id=?", Task.class);
query.setParameter(1, id);
List<Task> tasks = query.getResultList();
 类似资料:
  • 我们想为房间数据库构建一个过滤器,过滤器选项由用户选择。 i、 e.我们有一个带有字段(id、名称、日期、类型)的实体。用户可以按日期和/或名称过滤列表,其中包含文本和/或类型等于某个值 有办法在房间里做吗?

  • 问题内容: 我的软件在UTF8中得到的字符串比我转换为ISO 8859 1所需的字符串多。我知道UTF8域比iso 8859大。但是UTF8中的数据先前已从ISO上转换,所以我不应该错过任何内容。 我想知道是否存在从UTF8转换为iso-8859-1的简单/直接方法。 谢谢 问题答案: 这是您可能会发现有用的功能:。它可以转换为(包括欧元,但没有),但是对于-> -> 往返的-> 转换部分,它也可

  • 问题内容: 因此,我有一个方法,其中包含3种不同类型的参数: ,和。因此,想法是使用泛型来最小化接口 但是我已经意识到,是在运行时,and 参数实际上会使那失败。这是有道理的,这只是我的一厢情愿。 但是,如果我尝试将a强制转换为双精度,编译器将吠叫: 无法使用参数’(T)’调用类型’Double’的初始化程序 我认为这也是有道理的,因为没有Double的初始化程序需要Generic。 因此,看起来

  • 问题内容: 如标题所示:是否可以在SQL Server中关闭隐式类型转换? 我希望以下简单的SQL生成错误 问题答案: 无法禁用它。 不过已经提出了要求:请参阅来自Erland Sommarskog 的建议的MS Connect请求 但是,根据数据类型优先规则完全可以预测 您的外键示例很有趣,因为实际的FOREIGN KEY约束需要相同的数据类型,长度和排序规则。

  • @java接口注释。 如果我添加@Target(value=ElementType.METHOD),可以为Java方法导入此注释。 有没有办法让这个注释自动检查Java方法参数类型? 比如,我有一个方法: 一旦我添加了客户注释,它会自动检查sayHello参数类型是否匹配,如果不匹配,将导致编译错误。 它可以实现吗?如果,如何实现?排除在Runtime中使用java Reflect进行检查的想法,

  • 问题内容: 是否有内置的方法将布尔值转换为整数,反之亦然?我尝试了普通的转换,但是由于它们使用不同的基础类型,因此经典的转换方式是不可能的。我已经填写了一些规范,但尚未找到答案。 问题答案: 从int到bool很容易,只需完成操作即可。换句话说,由于Go不支持三元运算符,因此您必须执行以下操作: 您当然可以将其放在函数中: 整数有很多种可能的布尔解释,但它们都不一定是自然的,因此必须说出您的意思是