Java 使用JPA和Hibernate(NotNull)映射集合的最新子级
我需要从集合中获取最后一个实体元素。我使用@JoinFormula:Java 使用JPA和Hibernate(NotNull)映射集合的最新子级,java,hibernate,jpa,annotations,formula,Java,Hibernate,Jpa,Annotations,Formula,我需要从集合中获取最后一个实体元素。我使用@JoinFormula: @Entity public class Book { @ManyToOne @JoinFormula("(select * from (SELECT r.id FROM review r WHERE r.book_id = id ORDER BY r.postedAt DESC) where rownum = 1)")
@Entity
public class Book {
@ManyToOne
@JoinFormula("(select * from
(SELECT r.id FROM review r WHERE r.book_id = id ORDER BY r.postedAt DESC)
where rownum = 1)")
private Review
...
}
它的效果非常好,但前提是这本书有一些评论。否则书就找不到了。因为hibernate将其转换为WHERE语句中的交叉连接和使用条件:
review_entity.id =
(select * from (SELECT r.id FROM review r WHERE r.book_id = id ORDER BY r.postedAt DESC) where rownum = 1)
这里有没有将JoinFormula转换为left join或类似的选项
select
book0_.id as id1_0_0_,
book0_.title as title2_0_0_,
book0_.version as version3_0_0_,
(SELECT
r.id
FROM
review r
where
r.book_id = book0_.id
ORDER BY
r.postedAt DESC LIMIT 1) as formula1_0_,
review1_.id as id1_1_1_,
review1_.book_id as book_id4_1_1_,
review1_.comment as comment2_1_1_,
review1_.postedAt as postedAt3_1_1_
from
Book book0_
left outer join
Review review1_
on (
SELECT
r.id
FROM
review r
where
r.book_id = book0_.id
ORDER BY
r.postedAt DESC LIMIT 1
)=review1_.id
where
book0_.id=?
我不确定你去哪里是个好主意。你的领域模型与一本书有很多评论的现实不符。我知道您只想访问最新的评论,但作为一个单独的查询可能更好。否则,您可以更新域模型以反映实际情况,但仍然可以通过Hibernate的额外延迟属性以性能的方式获取最后一次审阅 “额外惰性”集合获取-集合的单个元素 根据需要从数据库访问集合。冬眠 除非绝对需要,否则不要将整个集合提取到内存中 (适用于非常大的收藏)
@实体
公共课堂用书{
@独身癖
@LazyCollection(LazyCollectionOption.EXTRA)
@订购人(“…”)
私有列表审查;//不需要通过公共API公开
公共评论GetLateStreeview(){
返回reviews.get(reviews.size()-1);//如果排序为desc,则返回第一个
}
}
Hibernate的@Where
子句也可以用作将集合限制为仅一个元素的替代方法
@Entity
public class Book {
@OneToMany
@LazyCollection(LazyCollectionOption.EXTRA)
@OrderBy("...")
private List<Review> reviews; //needn't be exposed via public API
public Review getLatestReview(){
return reviews.get(reviews.size() - 1); //or first if ordered desc
}
}