【问题标题】:Spring Data Load All lazy initialized Child Tables from ParentSpring Data 从父级加载所有延迟初始化的子表
【发布时间】:2017-05-04 05:29:39
【问题描述】:

我有一个父实体,其中包含 2 个延迟加载的子实体。我想在加载父实体时加载所有关联的子实体

@Entity
public class Author {
   @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;

    @OneToMany(mappedBy ="author",cascade= CascadeType.ALL,fetch=FetchType.LAZY)
    private List<Post> posts;

    @OneToMany(mappedBy ="author",cascade= CascadeType.ALL,fetch=FetchType.LAZY)
    private List<Book> books;
 }

使用动态查询根据作者名字加载所有书籍和帖子。

    public interface AuthorRepository extends CrudRepository<Author, Long> {
       public  List<Author>findByFirstNameAndPostsAndBooks()
    }

上面的 Findby 不起作用,请协助我构造正确的 Query。 我也试图暂时避免使用@Query 或 QueryDSL

【问题讨论】:

    标签: spring spring-boot spring-data spring-data-jpa


    【解决方案1】:

    要按名字获取作者,您应该将查询更改为:

    public List<Author>findByFirstName(String firstname);
    

    JPA 将自动加载作者postsbooks,因为您的@OneToMany 注释在您的Author 类中。

    spring.jpa.properties.hibernate.enable_lazy_load_no_trans=tr‌​ue 添加到您的application.properties 文件以启用延迟加载而无需事务注释。

    【讨论】:

    • 当我在 CRUD 存储库中将查询作为 findByPostsTitle 时,即使 FetchType Lazy 也可以工作,因为子表具有标题的 where 子句。我的问题是我想按作者名字加载所有帖子和书籍,而不使用 Spring Data Dynamic Query 在子表上指定任何 where 子句
    • @onlinecarren 你的意思是这样的吗? public List&lt;Author&gt;findByFirstName(String firstname); 这将按姓名获取所有作者,jpa 提供他的所有帖子和书籍,因为您的 @OneToMany 注释。
    • 但我想坚持延迟初始化,因为我不想通过子表加载,除非出于性能原因需要这样做
    • @onlinecarren 没问题。只是懒惰地离开它。如果您使用 getter,JPA 将加载它。但是这个查询对你有用吗?我会更新我的答案。
    • @onlinecarren。您必须使用此查询按名字查找作者:public List&lt;Author&gt;findByFirstName(String firstname);Jpa 为您完成剩下的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多