2

名前付きクエリに頭を悩ませています。私はJPAを使用しています.私が達成したいのは、特定の最後の状態(パラメーターとして渡される)について、アクティブなフラグを持つすべての記事を選択することです。

ここに私のクラスがあります:

  • 記事 (intId)
  • ArticleState (記事には 1 つまたは複数の状態がある場合がありますが、アクティブな状態のみです)
  • 状態(品物の状態)

    1. 保存しました
    2. 下書き
    3. 作り直した
    4. 承認済み
    5. アーカイブ済み
    6. 引退した

これが私のクエリです:

@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) が渡されますが、これは正しいものです。

何か案が?

ありがとうございました

4

1 に答える 1