2013-03-01 108 views
2

我敲开了命名查询。我使用JPA ..我想实现的是选择具有活动标志的所有文章,作为特定的最后状态(作为参数传递)。JPA NamedQuery子查询

这里是我的课:

  • 文章(INTID)
  • ArticleState(物品可以有一个或多个国家中,只有唯一的活跃虽然)
  • 国家(文章州)

    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:该文章现在已归档,因为它不再有用。

因此,文章经历了所有可能的状态。我的要求是,以显示两个不同的列表: 1.有效标志核准的条款(如果他们需要一些改变) 2.有效标志存档文章(如果它们被标记为“仍然有用”)

我问题在于我的文章显示在两个列表(批准和存档)中,即使最后一个状态实际上是“存档”。

指定的查询就像这样调用: List articlesWithActiveFlags = new ArrayList();

Query q = em.createNamedQuery("Article.listArticlesWithActiveFlags"); 
    q.setParameter("intStateId", intStateId); 

    articlesWithActiveFlags = q.setMaxResults(intRowLimit).getResultList(); 

    return articlesWithActiveFlags; 

该查询被称为两次,每个列表一个。我已经使用Eclipse调试模式验证了参数,并且它们传递了不同的参数(4个用于批准,5个用于存档),这是正确的。

有什么想法?

谢谢

回答

0

使用@NamedNativeQuery代替@NamedQuery here你有一个例子