如何预先形成JOIN FETCH查询以获得正确的结果?

时间:2016-11-10 09:33:02

标签: angularjs join data-binding fetch

好的,我有这样的事情:

有身份证,姓名和姓氏的学生......

现在我创建了一个名为ACCOUNTS的新java类,包含Id,Name和Value

还有:

@OneToMany(cascade = { CascadeType.ALL})
private Set<BankAccout> accounts;

public Student() {
    accounts= new HashSet<BankAccout>();
}

    public Set<BankAccout> getAccounts() {
    return accounts;
}

public void setAccounts(Set<BankAccout> accounts) {
    this.accounts= accounts;
}

现在,我有我的网站,在网站上有一张表格,上面有所有学生的数据......它们都是独一无二的

然后我不得不写一个新的课程,我必须在我的网站上添加一个listBox,显示所选的学生帐户...

我打电话给学生的旧查询看起来像这样:

@GET
@Path("/getAll")
@Produces(MediaType.APPLICATION_JSON)
public List<Student> getAll() {
    return em.createQuery("from Student s").getResultList();
}

并且控制器看起来像这样:

$http.get('http://localhost:8080/CreditCardWEB/rest/cc/getAll').success(
        function(data) {
            $scope.result = data;
        });

这一切都有效...在表中没有问题....但我不得不更改查询,以便能够将数据从帐户绑定到表....现在查询看起来像这样...

return em.createQuery("from Student s inner join fetch s.accounts").getResultList();

现在,桌子应该向我显示与以前相同的数据......也就是说,所有学生都是独一无二的......但它只向我展示了至少有一个帐户的学生....不仅如此,但是同一个学生不是一次出现,而是出现在桌子上的次数(他有账号)......

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

INNER JOIN过滤掉 表中不匹配的记录。因此,您当前的加入是删除没有帐户的学生。解决这个问题的方法是使用LEFT JOIN,即使他们没有帐户,也会保留所有学生:

return em.createQuery("from Student s left join fetch s.accounts").getResultList();

答案 1 :(得分:0)

我找到了解决方案,它与蒂姆非常接近。

这是:

    return em.createQuery("Select distinct s from Student s left join fetch s.accounts").getResultList();