我编写了一个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>
TypeRegistry
的Hibernate MyPropertyType
?答案 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
的类,请发表评论。