我在使用 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记录
1条答案
按热度按时间f1tvaqid1#
对于这个问题,唯一可行的解决办法是
创建两个单独的方法来检索account和post实体。
通过选择,构造自定义实体或使用元组。
在服务层过滤post表。
注意,我所做的 predicate 和表的连接是100%有效的