2014-01-31 71 views
0

我需要一些帮助。Sintaxis JQPL筛选器列表

我有这样的两个表

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; 

    .... 
} 

我需要与谁拥有活跃的问题=真正的出版物。 例如:我有出版物A和出版物B,其中A有5个问题,2个有效,B有6个问题,有5个有效。

我尝试做“选择从出版物P,问阙p其中p.idPublication = que.publication.idPublication和que.activo = 1”,但它返回与他们的所有问题发表...

我不能FINDE解决这个

请帮助

电贺

回答

0

你不会是能够做到准确想要的东西,因为实体从返回JPQL查询反映数据库中的内容(或持久性上下文)。换句话说,当你从JPQL查询中选择一个实体时,你会得到整个实体 - 你不能过滤它的关系,因为那样实体就不会反映数据库中的内容了。

在你的例子中,你基本上选择Publication s,它至少有一个活动的Question

要解决您的问题,您可以创建一个MapPublication以激活Question s。类似这样的:

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); 
}