使用criteriabuilder筛选联接表

2ul0zpep  于 2021-07-16  发布在  Java
关注(0)|答案(1)|浏览(377)

我在使用 predicate 筛选第二个表时遇到问题。
到目前为止,我有:

Public class Account {
private long id;
private String name;
@OneToMany(mappedBy = "account", orphanRemoval = true, cascade = CascadeType.ALL)
private Post<List> post;
}

Public class Post {
private long id;
private Date datePost;
private String message;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "ACCOUNT_ID")
private Account account;
}

我的dao类看起来像:

CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<ExceptionDeltaEvent> cq = cb.createQuery(Account.class);

        Root<Account> accountRoot = cq.from(Account.class);

        List<Predicate> whereRestrictions = new ArrayList<>();
        Join<Account, Post> accPost =
            accountRoot.join("post", JoinType.INNER);
                                                              //2021-03-16 to 2021-03-20
        whereRestrictions.add(cb.between(accPost.get("datePost"), fromDate, toDate));

        cq.where(whereRestrictions.stream()
            .toArray(Predicate[]::new))
            .distinct(true);

        TypedQuery<Account> query = em.createQuery(cq);

        return query.getResultList();

这是我的帐表:
idname1bob2ron公司
职位表:
iddatepostmessageaccount\ U id12021-03-17first122021-03-19second132021-03-28hello142021-03-18second2
返回的数据应该是acc id=1和2,post id为1、2和4
但不知怎的,它返回了所有的post记录

f1tvaqid

f1tvaqid1#

对于这个问题,唯一可行的解决办法是
创建两个单独的方法来检索account和post实体。
通过选择,构造自定义实体或使用元组。
在服务层过滤post表。
注意,我所做的 predicate 和表的连接是100%有效的

相关问题