在将参数设置为@Filter时,Hibernate会引发“NullPointerException”

时间:2012-10-18 07:23:55

标签: hibernate jpa

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

我没有想法,我一直试图弄清楚它可能是好几天,到处寻找无济于事。任何人都知道可能是什么?

谢谢!

编辑:在引发异常时更明确

1 个答案:

答案 0 :(得分:0)

好吧,即使文件对此不太清楚,这完全是我的错。

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

我的过滤行是:

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

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

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

正常运作。