0

我编写了一个 Hibernate UserType,它在我的 Java 类和 JDBC 之间进行类型转换VARCHAR。我将我的 bean 注释如下:

@TypeDef...
class MyClass {
    @Column(name = "...")
    @Type(type = "MyPropertyType")
    private MyProperty myProperty;

    @Column(name = "...")
    private Date date;
}

现在,用户可以通过命令行为该属性和其他属性指定条件。我想使用 JPA 将这些条件添加到查询中CriteriaBuilder,例如:

criteriaBuilder.equal(column, operand);

这样做,Hibernate 会抱怨operand(作为一个字符串)不对应于MyProperty.class. Hibernate 不会尝试自动转换类型(它可以这样做,因为它知道目标类型并且它有我的注释,它指向实现的类型StringRepresentableType。所以我将不得不手动进行类型转换。

  • 是否可以明确告诉 Hibernate 尝试将字符串转换为目标类型?或者我可以从 Hibernate 获取特定 bean 属性的 Type 实例吗?
  • 我在哪里可以得到 Hibernate 的TypeRegistry注册MyPropertyType地址?
4

1 回答 1

0

一种解决方案是创建第二个转换服务,将字符串转换为目标类型。我正在使用Spring 的转换工具

@Resource
ConversionService conversionService;

// ...

Object castedOperand = conversionService.convert(operand, column.getJavaType());

Hibernate 现在接受以下castedOperand条件

criteriaBuilder.equal(column, operand);

这通常是有道理的,因为第一个转换工具(Hibernate)将在 JDBC(例如VARCHAR)和 Java 类型之间进行转换,而第二个转换工具(Spring)执行用户输入(来自命令行或 HTTP 请求的字符串)和 Java 类型之间的转换。

如果有办法将 Hibernate 中已经存在的转换器TypeRegistry注入 Spring 中ConversionService,包括那些实现StringRepresentableType.

于 2012-12-21T19:22:19.773 回答