JPA NamedQuery子查询

时间:2013-03-01 17:34:39

标签: java-ee jpa named-query

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

以下是我的课程:

  • 文章(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.带有活动标志的存档文章(如果它们被标记为“仍然有用”)

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

命名查询的调用方式如下:         列出articlesWithActiveFlags = new ArrayList();

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

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

    return articlesWithActiveFlags;

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

有什么想法吗?

谢谢

1 个答案:

答案 0 :(得分:0)

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