在 Hibernate 6.2 中,如果有匹配的书籍,我希望获得具有最新 Book
的 Author
实体,并进入 Dto 投影 - AuthorBookDto
:
作者
public class Author {
@Id
@GeneratedValue(strategy = SEQUENCE, generator = "author_seq")
private Long id;
@JsonBackReference
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "author")
private List<Book> listBook = new ArrayList<>();
// other fields
// getters and setters
预订
public class Book {
@Id
@GeneratedValue(strategy = SEQUENCE, generator = "book_seq")
private Long id;
@JsonManagedReference
@ManyToOne(fetch = FetchType.EAGER, optional = false)
private Author author;
private LocalDateTime publishedDateTime;
我想要投影到的 Dto 包含来自 Author
的一些字段以及 Book 集合中最新的 Book
:
AuthorBookDto
public class AuthorBookDto {
// Selected fields from Author plus a book entity (the newest one)
public Long authorId;
public Long bookId;
public Book newestBook;
我编写了一个查询,它最多选择一个Author
,并且可以从Book
检索单个字段,但不能检索整个图书实体(下面的查询无法正确投影)至上述实体):
public Test customQuery3(Long id) {
return (Test) entityManager.createQuery(
"SELECT NEW com.view.Test(a.id, a.name, y.pub_max_date) FROM Author a " +
"LEFT JOIN(SELECT book.id as book_id, MAX(book.pubDateTime) as pub_max_date, book.author.id as bid FROM Book b WHERE book.author.id=:id) as y " +
"ON a.id=y.bid " +
"WHERE a.id=:id GROUP BY a.id, y.book_id ORDER BY y.pub_max_date DESC LIMIT 1")
.setParameter("id", id)
.getSingleResult();
结果应如下所示:
{
"id": 1,
"name": "Steven King",
Book {"id": "1",
"title":"The Shining",
"publishedDateTime":"2023-01-01 13:00"
}
}
这可以在一个 HQL 查询中实现吗? (注:有些作者可能没有出版过任何书籍)
最佳答案
此查询有效:
@Override
public Test customQuery3(Long id) {
return (Test) entityManager.createQuery(
"SELECT NEW com.view.Test(a.id, b) FROM Author a " +
"LEFT JOIN Book b ON b.author.id=a.id " +
"WHERE b.id=:id " +
"GROUP BY a, b ORDER BY b.newestBook DESC LIMIT 1")
.setParameter("id", id)
.getSingleResult();
}
订购b.newestBook
将最新的放在顶部,.getSingleResult()
和LIMIT 1
两者都确保只返回 1 个结果。
关于java - Hibernate 6 Left Join 集合的最新成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77005546/