获得Hibernate的TypeRegistry

时间:2012-12-21 09:26:55

标签: java hibernate jpa

我编写了一个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的类型。所以我将不得不手动进行类型转换。 / p>

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

1 个答案:

答案 0 :(得分:0)

解决方案是创建第二个转换服务,将字符串转换为目标类型。我正在使用Spring's conversion facility

@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的类,请发表评论。