我在命名查询中敲了敲头。我使用JPA ..我想要实现的是选择具有活动标志的所有文章,用于特定的最后状态(作为参数传递)。
以下是我的课程:
国家(文章的状态)
这是我的问题:
@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.带有活动标志的存档文章(如果它们被标记为“仍然有用”)
我的问题是我的文章出现在两个列表中(已批准和已归档),即使最后一个状态实际上是“已存档”。
命名查询的调用方式如下: 列出articlesWithActiveFlags = new ArrayList();
Query q = em.createNamedQuery("Article.listArticlesWithActiveFlags");
q.setParameter("intStateId", intStateId);
articlesWithActiveFlags = q.setMaxResults(intRowLimit).getResultList();
return articlesWithActiveFlags;
查询被调用两次,每个列表一个。我已经使用Eclipse调试模式验证了参数,并且它们传递了不同的参数(4个用于批准,5个用于存档),这是正确的。
有什么想法吗?
谢谢