Hibernate параметр ввода с функциями - PullRequest
2 голосов
/ 17 мая 2010

При использовании hibernate обычно он может определить тип ваших параметров, просматривая либо свойство, с которым он связан, либо hibernate, похоже, распознает определенные типы по умолчанию (например, java.util.Date).

Однако у меня есть несколько запросов, которые используют функции (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 как тип, который он может обрабатывать «из коробки», не забывая каждый раз явно передавать тип?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 19 мая 2010

Отвечая на мой вопрос.

Это, по-видимому, невозможно. По этому поводу существует давний запрос (5 ​​с половиной лет и более).

Спящий JIRA

Если вы хотите быть полным хакером, вы можете использовать некоторые неприятные размышления, чтобы сделать это. Я не рекомендую это делать, поскольку оно основано на проверке внутренних компонентов Hibernate и реализации UnmodifiableMap в 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 ) );
0 голосов
/ 17 мая 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...