用函数键入Hibernate参数

时间:2010-05-17 10:08:28

标签: java hibernate function parameters

当使用hibernate时,通常可以通过查看它所反对的属性来确定参数的类型,或者hibernate默认情况下会识别某些类型(例如java.util.Date)。

但是我有一些使用函数的查询(dateadd)。在这些查询中使用具有自定义类型绑定的对象失败(当它无法弄清楚类型时,hibernate似乎默认为BINARY)。我必须针对查询参数传递正确的hibernate“Type”。

这将失败

        Query query = session.createQuery( hql );
        query.setParameter( "now", new LocalDateTime() );
        return query.list();

这将有效(明确设置类型)

        Query query = session.createQuery( hql );
        query.setParameter( "now", new LocalDateTime(), Hibernate.custom( LocalDateTimeType.class ) );
        return query.list();

这也可以(使用java.util.Date)

        Query query = session.createQuery( hql );
        query.setParameter( "now", new Date() );
        return query.list();

有什么方法可以让Hibernate将LocalDateTime识别为一种可以开箱即用的类型,而不必记住每次都明确传递类型?

感谢。

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

回答我自己的问题。

这显然是不可能的。有一个长期的功能要求(5年半以上和计数)。

Hibernate JIRA

如果你想成为完全黑客,你可以使用一些讨厌的反射来做到这一点。我不建议这样做,因为它依赖于检查Hibernate的内部结构和JDK中UnmodifiableMap的实现。

    // HACK ALERT!!
    Field field = TypeFactory.class.getDeclaredField( "BASIC_TYPES" );
    field.setAccessible( true );
    Map basicTypes = (Map)field.get( null );

    field = basicTypes.getClass().getDeclaredField( "m" );
    field.setAccessible( true );
    Map underlyingMap = (Map)field.get( basicTypes );

    underlyingMap.put( SomeType.class.getName(), Hibernate.custom( MyCustomUserType.class ) );