当使用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识别为一种可以开箱即用的类型,而不必记住每次都明确传递类型?
感谢。
答案 0 :(得分:0)
答案 1 :(得分:0)
回答我自己的问题。
这显然是不可能的。有一个长期的功能要求(5年半以上和计数)。
如果你想成为完全黑客,你可以使用一些讨厌的反射来做到这一点。我不建议这样做,因为它依赖于检查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 ) );