Можете ли вы использовать собственные объекты в фильтре Hibernate? - PullRequest
1 голос
/ 10 марта 2010

У меня есть фильтр гибернации, который нужно оценивать, используя два разных столбца в базе данных. У меня есть другой существующий объект hibernate, который содержит оба этих поля, и я хотел бы иметь возможность передавать другой объект hibernate в вызов session.enableFilter.setParameter () вместо передачи обоих значений, содержащихся в нем по отдельности. *

В частности, я хотел бы заменить этот код:

session
     .enableFilter("inLocation")
     .setParameter("traversalLeft", 5)
     .setParameter("traversalRight", 10);

с этим кодом:

session
     .enableFilter("inLocation")
     .setParameter("location", locationHibernateObject)

чтобы лучше изолировать то, что нужно фильтру.

Но когда я пытаюсь настроить фильтр как:

@FilterDef(name="inLocation", parameters=@ParamDef( name="location", type="com.example.Location" ) )
@Filters( {
    @Filter(name="inLocation", condition="current_location_id in (select location.id from location where location.traversal_left between :location.traversalLeft+1 and :location.traversalRight)")
} )
public class ClassToFilter {

Я получаю сообщение об ошибке, пытаясь вызвать enableFilter ()

Это даже возможно? Что я делаю не так?

1 Ответ

3 голосов
/ 23 апреля 2010

Кажется, я столкнулся с той же проблемой.

Я использую hibernate-annotations-3.4.0.GA , и мои фильтры и пользовательские типы находятся в одном package-info.java файле. С этой настройкой проблема, кажется, в:

  • org.hibernate.cfg.AnnotationBinder#bindPackage(), где фильтры обрабатываются до, а не после пользовательских типов.
  • org.hibernate.cfg.AnnotationBinder#bindFilterDef(), который вообще не пытается обнаружить пользовательские типы.

Я изменил порядок вызова методов и заменил вызов в bindFilterDef() на:

    private static void bindFilterDef(FilterDef defAnn, ExtendedMappings mappings) {
        Map params = new HashMap();
        for (ParamDef param : defAnn.parameters()) {
            ///////////////////////////////////////////////////////////////////////////////////////////////////////////
            // support for custom types in filters
            params.put( param.name(), getType( param.type(), mappings ) );
        }
        FilterDefinition def = new FilterDefinition( defAnn.name(), defAnn.defaultCondition(), params );
        log.info( "Binding filter definition: {}", def.getFilterName() );
        mappings.addFilterDefinition( def );
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // support for custom types in filters
    private static org.hibernate.type.Type getType(String paramType, ExtendedMappings mappings) {
        org.hibernate.type.Type heuristicType = TypeFactory.heuristicType( paramType );
        if ( heuristicType == null ) {
            org.hibernate.mapping.TypeDef typeDef = mappings.getTypeDef(paramType);
            if ( typeDef != null ) {
                heuristicType = TypeFactory.heuristicType( typeDef.getTypeClass(), typeDef.getParameters() );
            }
        }
        log.debug( "for param type: {} parameter heuristic type : {}", paramType, heuristicType );
        return heuristicType;
    }

Конечно, тогда мне нужно было собрать банку с нуля, но изменение, похоже, решило проблему.

Однако в Hibernate 3.5 классы аннотаций связаны внутри hibernate3.jar , поэтому может потребоваться дополнительная работа, поскольку все должно быть построено с нуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...