代码之家  ›  专栏  ›  技术社区  ›  Mike Q

使用函数键入休眠参数

  •  2
  • Mike Q  · 技术社区  · 14 年前

    当使用Hibernate时,通常可以通过查看它所反对的属性来确定参数的类型,或者Hibernate似乎默认地识别某些类型(例如Java.U.T.Dead)。

    但是,我有一些使用函数(dateadd)的查询。在这些查询中,使用具有自定义类型绑定的对象失败(当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. U.L.DATE)

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

    是否有任何方法可以让Hibernate将LocalDateTime识别为它可以在开箱即用的情况下处理的类型,而不必记住每次都显式地传入该类型?

    谢谢。

    2 回复  |  直到 14 年前
        2
  •  0
  •   Mike Q    14 年前

    回答我自己的问题。

    这显然是不可能的。在此基础上有一个长期的功能请求(5 1/2岁,正在计算)。

    Hibernate JIRA

    如果你想成为一个完全的黑客,你可以用一些讨厌的反射来做这件事。我不建议这样做,因为它依赖于检查Hibernate的内部和JDK中不可修改映射的实现。

        // 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 ) );