2010-05-17 38 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