hibernate中的数据类型异常

时间:2013-08-17 16:51:08

标签: hibernate hql

我在pojo中拥有类型为

的属性
private DateTime updateddate;

现在我必须将其类型设置为hibernate查询,请建议将是什么类型。

addScalar("updateddate",Hibernate.DATE)

抛出这个例外。

org.hibernate.property.BasicPropertyAccessor    IllegalArgumentException in class:  setter method of property: updateddate
2013-08-17 16:41:08.252 ERROR   [NDC=]  [Thread-73] org.hibernate.property.BasicPropertyAccessor    expected type: com.rbsfm.ice.common.date.DateTime, actual value: java.sql.Time

1 个答案:

答案 0 :(得分:1)

由于DateTime是您自己的类型,您需要:

  1. 使用自定义UserType(基本上是用于将SQL类型转换为您自己的POJO类型的Hibernate适配器)映射属性。
  2. 将映射属性更改为Hibernate理解的类型,例如java.util.Datejava.sql.Timestamp
  3. 使用上述
  4. 的组合

    另请注意,如果您需要保留日期时间数据的“时间”部分,则需要使用Hibernate.TIMESTAMP作为标量类型(但是这假设您正在使用其中一个标准Java类型)。

    编辑:要完成#1,请实现UserType interface(假设您在OP中使用Hibernate.DATE版本3)并通过以下内容将其映射到您的字段(假设XML映射):

    <hibernate-mapping>
        <typedef name="dateTimeUserType" class="your.custom.DateTimeUserType"/>
        <class ...>
            <!-- rest of mapping here -->
            <property name="updateddate" type="dateTimeUserType" column="UpdatedDate"/>
        </class>
    </hibernate-mapping>
    

    然后你也应该能够为你的标量使用自定义类型:

    query.addScalar("updateddate", Hibernate.custom(your.custom.DateTimeUserType.class));
    

    请注意,这些代码片段对于Hibernate 4.x略有不同,但原理是相同的。