名前付きクエリに頭を悩ませています。私はJPAを使用しています.私が達成したいのは、特定の最後の状態(パラメーターとして渡される)について、アクティブなフラグを持つすべての記事を選択することです。
ここに私のクラスがあります:
- 記事 (intId)
- ArticleState (記事には 1 つまたは複数の状態がある場合がありますが、アクティブな状態のみです)
状態(品物の状態)
- 保存しました
- 下書き
- 作り直した
- 承認済み
- アーカイブ済み
- 引退した
これが私のクエリです:
@NamedQuery(
name = "Article.listArticlesWithActiveFlags",
query = "SELECT DISTINCT article " +
"FROM Article article " +
"INNER JOIN article.articleFlags articleFlag " +
"INNER JOIN article.articleStates articleState " +
"WHERE articleFlag.active = true " +
"AND articleState.state.intId = :intStateId " +
"AND articleState.intId = ( " +
" SELECT MAX(articleState2.intId) " +
" FROM Article article2 " +
" INNER JOIN article2.articleStates articleState2 " +
" WHERE articleState2.state.intId = :intStateId " +
" AND articleState2.article.intId = article.intId " +
" GROUP BY article2.intId) "
),
クエリはエラーなしで正常に実行されます。私の問題: 次のライフサイクルを持つ記事があるとしましょう:
2012-02-24: 作成されたため、「保存済み」状態 2012-02-25: 承認のために送信されたため、現在は「下書き」状態 2012-02-26: モデレーターが特定の基準を満たすように記事を修正2012-03-01: 記事は現在コミュニティ全体で承認されているため、現在は「承認済み」です 2014-03-01: 記事は役に立たなくなったためアーカイブされました.
したがって、記事は考えられるすべての状態を通過しました。私の要件は、2 つの別々のリストを表示することです。
私の問題は、最後の状態が実際には「アーカイブ済み」であっても、記事が両方のリスト (承認済みとアーカイブ済み) に表示されることです。
名前付きクエリは次のように呼び出されます。 List articleWithActiveFlags = new ArrayList();
Query q = em.createNamedQuery("Article.listArticlesWithActiveFlags");
q.setParameter("intStateId", intStateId);
articlesWithActiveFlags = q.setMaxResults(intRowLimit).getResultList();
return articlesWithActiveFlags;
クエリは、各リストに対して 1 回ずつ、合計 2 回呼び出されます。Eclipse デバッグ モードを使用してパラメーターを確認したところ、異なるパラメーター (承認済みの場合は 4、アーカイブ済みの場合は 5) が渡されますが、これは正しいものです。
何か案が?
ありがとうございました