Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JPA和Hibernate(NotNull)映射集合的最新子级_Java_Hibernate_Jpa_Annotations_Formula - Fatal编程技术网

Java 使用JPA和Hibernate(NotNull)映射集合的最新子级

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)")

我需要从集合中获取最后一个实体元素。我使用@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)")
    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
    }
}