Java 能否在Hibernate筛选器中使用自定义对象?

Java 能否在Hibernate筛选器中使用自定义对象?,java,hibernate,Java,Hibernate,我有一个hibernate过滤器,需要使用数据库中的两个不同列进行计算。我有另一个包含这两个字段的现有hibernate对象,我希望能够将另一个hibernate对象传递到session.enableFilter.setParameter()调用中,而不是分别传递其中包含的两个值 具体而言,我想替换此代码: session .enableFilter("inLocation") .setParameter("traversalLeft", 5) .setParame

我有一个hibernate过滤器,需要使用数据库中的两个不同列进行计算。我有另一个包含这两个字段的现有hibernate对象,我希望能够将另一个hibernate对象传递到session.enableFilter.setParameter()调用中,而不是分别传递其中包含的两个值

具体而言,我想替换此代码:

session
     .enableFilter("inLocation")
     .setParameter("traversalLeft", 5)
     .setParameter("traversalRight", 10);
session
     .enableFilter("inLocation")
     .setParameter("location", locationHibernateObject)
使用此代码:

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()时出错


这是可能的吗?我做错了什么?

我似乎遇到了同样的问题

我使用的是hibernate-annotations-3.4.0.GA,我的过滤器和自定义类型位于一个包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; } 私有静态void bindFilterDef(FilterDef defAnn,ExtendedMappings){ Map params=新的HashMap(); 对于(ParamDef param:defAnn.parameters()){ /////////////////////////////////////////////////////////////////////////////////////////////////////////// //在过滤器中支持自定义类型 put(param.name(),getType(param.type(),mappings)); } FilterDefinition def=新的FilterDefinition(defAnn.name(),defAnn.defaultCondition(),params); info(“绑定筛选器定义:{}”,def.getFilterName()); addFilterDefinition(def); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //在过滤器中支持自定义类型 私有静态org.hibernate.type.type getType(字符串参数类型,扩展映射){ org.hibernate.type.type heuristicType=TypeFactory.heuristicType(paramType); if(heuristicType==null){ org.hibernate.mapping.TypeDef=mappings.getTypeDef(paramType); 如果(typeDef!=null){ heuristicType=TypeFactory.heuristicType(typeDef.getTypeClass(),typeDef.getParameters()); } } debug(“对于参数类型:{}参数启发式类型:{}”,参数类型,启发式类型); 返回启发式类型; } 当然,后来我不得不从头开始构建jar,但是这个改变似乎解决了这个问题


然而,在Hibernate 3.5中,注释类被捆绑在hibernate3.jar中,因此可能需要做更多的工作,因为一切都必须从头开始构建。

这无疑让它听起来像是一个Hibernate问题,而不仅仅是我缺少的配置。