【发布时间】:2020-11-17 09:33:12
【问题描述】:
我有以下实体
Book {
private String title;
@ManyToMany
@JoinTable(
name = "book_should_read_user",
joinColumns = @JoinColumn(name = "book_id"),
inverseJoinColumns = @JoinColumn(name = "user_id")
)
private Set<User> shouldRead; // the users who should read the book
@OneToMany(mappedBy = "book")
private Set<BookReadAction> actions; // all the read actions performed on the book
}
BookReadAction {
@ManyToOne
private Book book;
@ManyToOne
private User user;
}
现在我想查询应该阅读集合中所有用户已阅读的所有书籍。 postgres 中的以下 sql 查询可以解决问题:
select *
from book
where id in (
select distinct id
from (
select book.id id,
array_agg(book_should_read_user.user_id) suggested_readers,
array_agg(distinct book_read_action.user_id) read_by
from book b
inner join book_should_read_user on book.id = book_should_read_user.book_id
inner join book_read_action on book.id = book_read_action.book_id
group by book.id) subquery
where suggested_readers <@ read_by)
然而,我想以编程方式添加这个子句,所以我宁愿使用 JPA 标准 API。尽管做了一些尝试,我还是很挣扎。是否可以在 JPA 标准 API 中从此查询构建谓词?
【问题讨论】:
标签: java sql hibernate jpa criteria-api