2010-05-17 34 views
2

使用hibernate时,通常可以通过查看它所反对的属性来找出参数的类型,或者hibernate默认识别某些类型(例如java.util.Date)。使用函数进行Hibernate参数打字

但是我有一些使用函数(dateadd)的查询。在这些查询中使用具有自定义类型绑定的对象失败(当它无法计算出类型时,hibernate似乎将其默认为BINARY)。我必须在查询参数中传入正确的休眠“类型”。

这将失败

 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

回答我的问题。

这显然是不可能的。有一个长期的功能要求(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)); 
0
+0

我想你已经误解了这个问题。这不是关于属性的自定义类型,而是当hibernate无法从运算符的另一端推断出类型时,它会通过类来识别参数类型。开箱即可识别某些类型,但我看不到添加我自己的类型映射的方式,它可以重新使用。 – 2010-05-17 19:15:17