【发布时间】:2013-03-01 17:34:38
【问题描述】:
我在命名查询上大吃一惊。我使用 JPA.. 我想要实现的是选择所有带有活动标志的文章,用于特定的最后状态(作为参数传递)。
这是我的课程:
- 文章 (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. 带有活动标记的存档文章(以防它们被标记为“仍然有用”)
我的问题是我的文章显示在两个列表中(已批准和已归档),即使最后一个状态实际上是“已归档”。
命名查询是这样调用的: 列出文章WithActiveFlags = new ArrayList();
Query q = em.createNamedQuery("Article.listArticlesWithActiveFlags");
q.setParameter("intStateId", intStateId);
articlesWithActiveFlags = q.setMaxResults(intRowLimit).getResultList();
return articlesWithActiveFlags;
查询被调用两次,每个列表调用一次。我已经使用Eclipse调试模式验证了参数,它们传递了不同的参数(4个批准,5个归档),这是正确的。
有什么想法吗?
谢谢
【问题讨论】:
标签: jakarta-ee jpa named-query