2

我有一个非常奇怪的问题。我正在使用 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)

我没有想法,几天来我一直在试图弄清楚它可能是什么,到处搜索都无济于事。有人知道可能是什么吗?

谢谢!

编辑:在引发异常时更清楚

4

1 回答 1

1

好吧,这完全是我的错,即使文档对此并不十分清楚。

您确实可以通过注释传递变量,但问题出在过滤器的名称上。我在示例中简化了太多(因此是我的错)并使用了不同的过滤器名称。您不能使用与命名查询相同的策略命名过滤器(即 class.filtername),因为这样做 Hibernate 将“拆分”过滤器并仅获取点之前的部分。因此过滤器不存在,导致上述异常。

我的过滤线是:

@Filter(name = "className.filterName", condition = "fieldVal=:value")

这引发了异常,因为 Hibernate 在处理 QueryParameters.java 的第 492 行的过滤器时,拆分过滤器名称并仅查找名为 className 的过滤器。将其更改为:

@Filter(name = "filterName", condition = "fieldVal=:value")

工作正常。

于 2012-10-18T10:31:47.970 回答