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