2 Stimmen

Hibernate-Parametertypisierung mit Funktionen

Bei der Verwendung von Hibernate kann es normalerweise den Typ Ihrer Parameter herausfinden, indem es entweder die Eigenschaft betrachtet, gegen die es gerichtet ist, oder Hibernate scheint bestimmte Typen standardmäßig zu erkennen (z. B. java.util.Date).

Ich habe jedoch einige Abfragen, die Funktionen verwenden (dateadd). In diesen Abfragen schlägt die Verwendung eines Objekts mit einem benutzerdefinierten Typ fehl (Hibernate scheint es auf BINARY vorzugeben, wenn es den Typ nicht herausfinden kann). Ich muss den richtigen Hibernate-"Typ" an den Abfrageparameter übergeben.

Dies wird scheitern

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

Dies wird funktionieren (Typ explizit eingestellt)

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

Dies funktioniert auch (mit java.util.Date)

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

Gibt es eine Möglichkeit, wie ich Hibernate dazu bringen kann, LocalDateTime als einen Typ zu erkennen, den es sofort verarbeiten kann, ohne jedes Mal daran denken zu müssen, den Typ explizit zu übergeben?

Danke.

0voto

0voto

Mike Q Punkte 22080

Ich beantworte meine eigene Frage.

Dies ist offensichtlich nicht möglich. Es gibt eine seit langem bestehende Anfrage zu diesem Thema (5 1/2 Jahre alt und weiter).

Hibernate JIRA

Wenn Sie ein kompletter Hacker sein wollen, können Sie dazu eine böse Reflexion verwenden. Ich empfehle dies nicht, da es auf der Inspektion der Interna von Hibernate und der Implementierung von UnmodifiableMap im JDK beruht.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X