我敲开了命名查询。我使用JPA ..我想实现的是选择具有活动标志的所有文章,作为特定的最后状态(作为参数传递)。JPA NamedQuery子查询
这里是我的课:
- 文章(INTID)
- ArticleState(物品可以有一个或多个国家中,只有唯一的活跃虽然)
国家(文章州)
- 保存
- 草案
- 返工
- 批准
- 存档
- 退休
这里是我的查询:
@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个用于存档),这是正确的。
有什么想法?
谢谢