【问题标题】:Sintaxis JQPL Filter listSintaxis JQPL 过滤器列表
【发布时间】:2014-02-24 02:27:33
【问题描述】:

我需要一些帮助。

我有这两张桌子

public class Publication implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idPublication")
    private Integer idPublication;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "publication")
    private List<Question> questionList;

    ....
}

塔布拉问题

public class Question implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idQuestion")
    private Integer idQuestion;

    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 500)
    @Column(name = "pregunta")
    private String question;

    @JoinColumn(name = "publication", referencedColumnName = "idPublication")
    @ManyToOne(optional = false)
    private Publication publication;

    @NotNull
    private Boolean activo;

    ....
}

我需要获得带有 active = true 问题的出版物。 示例:我有出版物 A 和出版物 B,其中 A 有 5 个问题,其中 2 个处于活动状态,B 有 6 个问题,其中 5 个处于活动状态。

我尝试执行“从出版物 p 中选择 p,问题 que,其中 p.idPublication = que.publication.idPublication 和 que.activo = 1”,但它会返回包含所有问题的出版物...

我找不到解决办法

请帮忙

问候

【问题讨论】:

    标签: java jpql


    【解决方案1】:

    您将无法完全按照您的意愿行事,因为从 JPQL 查询返回的实体反映了数据库(或持久性上下文)中的内容。换句话说,当您从 JPQL 查询中选择一个实体时,您将获得整个实体——您无法过滤其关系,因为这样该实体将不再反映数据库中的内容。

    在您的示例中,您实际上是在选择至少有 1 个活动 Question 的 Publications。

    要解决您的问题,您可以将Publication 的Map 构建为活动的Questions。像这样的:

    TypedQuery<Question> query = 
      em.createQuery("select q from Question q where q.activo = true", Question.class);
    List<Question> activeQuestions = query.getResultList();
    
    Map<Publication, List<Question>> publicationToActiveQuestions = new HashMap<>();
    for (Question q : activeQuestions)
    {
      List<Question> publicationQuestions = publicationToActiveQuestions.get(q.getPublication());
      if (publicationQuestions == null)
      {
        publicationQuestions = new ArrayList<>();
        publicationToActiveQuestions.put(q.getPublication(), publicationQuestions);
      }
      publicationQuestions.add(q);
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多