2

私は非常に奇妙な問題を抱えています。Postgres9.1でHibernate4.1.7を使用しています。私のエンティティクラスでは、アノテーションを使用してフィルターを定義しました。

@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)

私はアイデアがありません。何日もの間それが何であるかを理解しようとしていて、どこでも無駄に検索しました。誰かが何ができるかについての手がかりを持っていますか?

ありがとう!

Edited: made more clear when the exception was raised

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 に答える