我有一个非常奇怪的问题。我正在使用Hibernate 4.1.7和Postgres 9.1。在我的实体类中,我使用注释定义了一个过滤器:
@FilterDef(name = "filterName", parameters=@ParamDef(name="paramInt", type="integer" ))
然后我将@Filter添加到集合中。如果过滤器以这种方式定义:
@OneToMany(cascade = CascadeType.ALL, mappedBy = "linkField")
@Filter(name = "filterName", condition = "fieldVal=0")
private Collection<ChildClass> children;
一切正常,集合被正确过滤,我只看到fieldVal为0的孩子。另一方面,我这样做:
@OneToMany(cascade = CascadeType.ALL, mappedBy = "linkField")
@Filter(name = "filterName", condition = "fieldVal=:paramInt")
private Collection<ChildClass> children;
我在我的代码中设置了参数,正确设置了“过滤器”(在调试器中检查它)但是,当访问集合时,它引发了以下异常:
java.lang.NullPointerException:
at org.hibernate.engine.spi.QueryParameters.processFilters(QueryParameters.java:492)
at org.hibernate.engine.spi.QueryParameters.processFilters(QueryParameters.java:462)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1688)
at org.hibernate.loader.Loader.doQuery(Loader.java:832)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:293)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:263)
at org.hibernate.loader.Loader.loadCollection(Loader.java:2094)
at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:61)
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:678)
at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:82)
at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1801)
at org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:524)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:212)
at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:520)
at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:125)
at org.hibernate.collection.internal.AbstractPersistentCollection$1.doWork(AbstractPersistentCollection.java:152)
at org.hibernate.collection.internal.AbstractPersistentCollection$1.doWork(AbstractPersistentCollection.java:139)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:212)
at org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:138)
at org.hibernate.collection.internal.PersistentBag.size(PersistentBag.java:242)
我没有想法,我一直试图弄清楚它可能是好几天,到处寻找无济于事。任何人都知道可能是什么?
谢谢!
编辑:在引发异常时更明确
答案 0 :(得分:0)
好吧,即使文件对此不太清楚,这完全是我的错。
您确实可以通过注释传递变量,但问题出在过滤器的名称中。我在我的例子中简化了太多(因此我的错)并使用了不同的过滤器名称。您不能使用您采用的相同策略命名过滤器,也可能是命名查询(即class.filtername),因为这样做Hibernate将“拆分”过滤器并仅获取点之前的部分。因此,过滤器不存在,导致上述异常。
我的过滤行是:
@Filter(name = "className.filterName", condition = "fieldVal=:value")
并且引发了异常,因为Hibernate在处理QueryParameters.java的第492行的过滤器时,拆分了过滤器名称并且只查找了一个名为className的过滤器。将其更改为:
@Filter(name = "filterName", condition = "fieldVal=:value")
正常运作。