【问题标题】:Java JPA Spring multiple query for lookup table用于查找表的 Java JPA Spring 多重查询
【发布时间】:2020-08-23 05:43:13
【问题描述】:

我有一个带有架构的查找表

在我的控制器中,我根据“lookup_type”调用此表

    FormProdIndex f = new FormProdIndex();
    model.addAttribute(AuthenticationBase.MODEL_FORMPRODINDEX, f);

    // Lookup Models
    System.out.println("TEST 1");
    model.addAttribute(AuthenticationBase.LOOKUP_FACTORY, this.appLookupDAO.getFactoryList());

此查找模型与我的主模型“FormProdIndex”相关联

@Entity
@Table(name = "Form_Prod_Index")
public class FormProdIndex {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "index_id", nullable = false)
    private Long indexId;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "factory_Id", referencedColumnName = "lookup_Id")
    private AppLookup lookupFactory;

    // getter and setters
}

和我的查找模型

@Entity
@Table(name = "App_Lookup")
public class AppLookup {
 
    @Id
    @GeneratedValue
    @Column(name = "Lookup_Id", nullable = false)
    private Long lookupId;
 
    @Column(name = "Lookup_type", length = 30, nullable = false)
    private String lookupType;
 
    @Column(name = "Lookup_Name", length = 30, nullable = false)
    private String lookupName;

    @OneToOne(mappedBy = "lookupFactory")
    @Fetch(FetchMode.JOIN)
    private FormProdIndex FormProdIndexFactory;

    // getter and setter
}

正如您在 java 日志中看到的那样,我的主模型“FormProdIndex”的 SELECT 查询被多次调用。

TEST 1
Hibernate: select applookup0_.lookup_id as lookup_i1_0_, applookup0_.lookup_desc as lookup_d2_0_, applookup0_.lookup_name as lookup_n3_0_, applookup0_.lookup_type as lookup_t4_0_ from app_lookup applookup0_ where applookup0_.lookup_type='factory' order by applookup0_.lookup_id
Hibernate: select formprodin0_.index_id as index_id1_3_1_, formprodin0_.approved_by as approved2_3_1_, formprodin0_.approved_date as approved3_3_1_, formprodin0_.break_time_mins as break_ti4_3_1_, formprodin0_.created_by as created_5_3_1_, formprodin0_.created_date as created_6_3_1_, formprodin0_.end_date as end_date7_3_1_, formprodin0_.end_time as end_time8_3_1_, formprodin0_.interval_mins as interval9_3_1_, formprodin0_.is_deleted as is_dele10_3_1_, formprodin0_.factory_id as factory21_3_1_, formprodin0_.pack_size as pack_si11_3_1_, formprodin0_.pack_supplier as pack_su12_3_1_, formprodin0_.reject_id as reject_13_3_1_, formprodin0_.rejected_by as rejecte14_3_1_, formprodin0_.rejected_date as rejecte15_3_1_, formprodin0_.remarks as remarks16_3_1_, formprodin0_.session_id as session17_3_1_, formprodin0_.start_date as start_d18_3_1_, formprodin0_.start_time as start_t19_3_1_, formprodin0_.status as status20_3_1_, applookup1_.lookup_id as lookup_i1_0_0_, applookup1_.lookup_desc as lookup_d2_0_0_, applookup1_.lookup_name as lookup_n3_0_0_, applookup1_.lookup_type as lookup_t4_0_0_ from form_prod_index formprodin0_ left outer join app_lookup applookup1_ on formprodin0_.factory_id=applookup1_.lookup_id where formprodin0_.factory_id=?
Hibernate: select formprodin0_.index_id as index_id1_3_1_, formprodin0_.approved_by as approved2_3_1_, formprodin0_.approved_date as approved3_3_1_, formprodin0_.break_time_mins as break_ti4_3_1_, formprodin0_.created_by as created_5_3_1_, formprodin0_.created_date as created_6_3_1_, formprodin0_.end_date as end_date7_3_1_, formprodin0_.end_time as end_time8_3_1_, formprodin0_.interval_mins as interval9_3_1_, formprodin0_.is_deleted as is_dele10_3_1_, formprodin0_.factory_id as factory21_3_1_, formprodin0_.pack_size as pack_si11_3_1_, formprodin0_.pack_supplier as pack_su12_3_1_, formprodin0_.reject_id as reject_13_3_1_, formprodin0_.rejected_by as rejecte14_3_1_, formprodin0_.rejected_date as rejecte15_3_1_, formprodin0_.remarks as remarks16_3_1_, formprodin0_.session_id as session17_3_1_, formprodin0_.start_date as start_d18_3_1_, formprodin0_.start_time as start_t19_3_1_, formprodin0_.status as status20_3_1_, applookup1_.lookup_id as lookup_i1_0_0_, applookup1_.lookup_desc as lookup_d2_0_0_, applookup1_.lookup_name as lookup_n3_0_0_, applookup1_.lookup_type as lookup_t4_0_0_ from form_prod_index formprodin0_ left outer join app_lookup applookup1_ on formprodin0_.factory_id=applookup1_.lookup_id where formprodin0_.factory_id=?
Hibernate: select formprodin0_.index_id as index_id1_3_1_, formprodin0_.approved_by as approved2_3_1_, formprodin0_.approved_date as approved3_3_1_, formprodin0_.break_time_mins as break_ti4_3_1_, formprodin0_.created_by as created_5_3_1_, formprodin0_.created_date as created_6_3_1_, formprodin0_.end_date as end_date7_3_1_, formprodin0_.end_time as end_time8_3_1_, formprodin0_.interval_mins as interval9_3_1_, formprodin0_.is_deleted as is_dele10_3_1_, formprodin0_.factory_id as factory21_3_1_, formprodin0_.pack_size as pack_si11_3_1_, formprodin0_.pack_supplier as pack_su12_3_1_, formprodin0_.reject_id as reject_13_3_1_, formprodin0_.rejected_by as rejecte14_3_1_, formprodin0_.rejected_date as rejecte15_3_1_, formprodin0_.remarks as remarks16_3_1_, formprodin0_.session_id as session17_3_1_, formprodin0_.start_date as start_d18_3_1_, formprodin0_.start_time as start_t19_3_1_, formprodin0_.status as status20_3_1_, applookup1_.lookup_id as lookup_i1_0_0_, applookup1_.lookup_desc as lookup_d2_0_0_, applookup1_.lookup_name as lookup_n3_0_0_, applookup1_.lookup_type as lookup_t4_0_0_ from form_prod_index formprodin0_ left outer join app_lookup applookup1_ on formprodin0_.factory_id=applookup1_.lookup_id where formprodin0_.factory_id=?
Hibernate: select formprodin0_.index_id as index_id1_3_1_, formprodin0_.approved_by as approved2_3_1_, formprodin0_.approved_date as approved3_3_1_, formprodin0_.break_time_mins as break_ti4_3_1_, formprodin0_.created_by as created_5_3_1_, formprodin0_.created_date as created_6_3_1_, formprodin0_.end_date as end_date7_3_1_, formprodin0_.end_time as end_time8_3_1_, formprodin0_.interval_mins as interval9_3_1_, formprodin0_.is_deleted as is_dele10_3_1_, formprodin0_.factory_id as factory21_3_1_, formprodin0_.pack_size as pack_si11_3_1_, formprodin0_.pack_supplier as pack_su12_3_1_, formprodin0_.reject_id as reject_13_3_1_, formprodin0_.rejected_by as rejecte14_3_1_, formprodin0_.rejected_date as rejecte15_3_1_, formprodin0_.remarks as remarks16_3_1_, formprodin0_.session_id as session17_3_1_, formprodin0_.start_date as start_d18_3_1_, formprodin0_.start_time as start_t19_3_1_, formprodin0_.status as status20_3_1_, applookup1_.lookup_id as lookup_i1_0_0_, applookup1_.lookup_desc as lookup_d2_0_0_, applookup1_.lookup_name as lookup_n3_0_0_, applookup1_.lookup_type as lookup_t4_0_0_ from form_prod_index formprodin0_ left outer join app_lookup applookup1_ on formprodin0_.factory_id=applookup1_.lookup_id where formprodin0_.factory_id=?
Hibernate: select formprodin0_.index_id as index_id1_3_1_, formprodin0_.approved_by as approved2_3_1_, formprodin0_.approved_date as approved3_3_1_, formprodin0_.break_time_mins as break_ti4_3_1_, formprodin0_.created_by as created_5_3_1_, formprodin0_.created_date as created_6_3_1_, formprodin0_.end_date as end_date7_3_1_, formprodin0_.end_time as end_time8_3_1_, formprodin0_.interval_mins as interval9_3_1_, formprodin0_.is_deleted as is_dele10_3_1_, formprodin0_.factory_id as factory21_3_1_, formprodin0_.pack_size as pack_si11_3_1_, formprodin0_.pack_supplier as pack_su12_3_1_, formprodin0_.reject_id as reject_13_3_1_, formprodin0_.rejected_by as rejecte14_3_1_, formprodin0_.rejected_date as rejecte15_3_1_, formprodin0_.remarks as remarks16_3_1_, formprodin0_.session_id as session17_3_1_, formprodin0_.start_date as start_d18_3_1_, formprodin0_.start_time as start_t19_3_1_, formprodin0_.status as status20_3_1_, applookup1_.lookup_id as lookup_i1_0_0_, applookup1_.lookup_desc as lookup_d2_0_0_, applookup1_.lookup_name as lookup_n3_0_0_, applookup1_.lookup_type as lookup_t4_0_0_ from form_prod_index formprodin0_ left outer join app_lookup applookup1_ on formprodin0_.factory_id=applookup1_.lookup_id where formprodin0_.factory_id=?
Hibernate: select formprodin0_.index_id as index_id1_3_1_, formprodin0_.approved_by as approved2_3_1_, formprodin0_.approved_date as approved3_3_1_, formprodin0_.break_time_mins as break_ti4_3_1_, formprodin0_.created_by as created_5_3_1_, formprodin0_.created_date as created_6_3_1_, formprodin0_.end_date as end_date7_3_1_, formprodin0_.end_time as end_time8_3_1_, formprodin0_.interval_mins as interval9_3_1_, formprodin0_.is_deleted as is_dele10_3_1_, formprodin0_.factory_id as factory21_3_1_, formprodin0_.pack_size as pack_si11_3_1_, formprodin0_.pack_supplier as pack_su12_3_1_, formprodin0_.reject_id as reject_13_3_1_, formprodin0_.rejected_by as rejecte14_3_1_, formprodin0_.rejected_date as rejecte15_3_1_, formprodin0_.remarks as remarks16_3_1_, formprodin0_.session_id as session17_3_1_, formprodin0_.start_date as start_d18_3_1_, formprodin0_.start_time as start_t19_3_1_, formprodin0_.status as status20_3_1_, applookup1_.lookup_id as lookup_i1_0_0_, applookup1_.lookup_desc as lookup_d2_0_0_, applookup1_.lookup_name as lookup_n3_0_0_, applookup1_.lookup_type as lookup_t4_0_0_ from form_prod_index formprodin0_ left outer join app_lookup applookup1_ on formprodin0_.factory_id=applookup1_.lookup_id where formprodin0_.factory_id=?
Hibernate: select formprodin0_.index_id as index_id1_3_1_, formprodin0_.approved_by as approved2_3_1_, formprodin0_.approved_date as approved3_3_1_, formprodin0_.break_time_mins as break_ti4_3_1_, formprodin0_.created_by as created_5_3_1_, formprodin0_.created_date as created_6_3_1_, formprodin0_.end_date as end_date7_3_1_, formprodin0_.end_time as end_time8_3_1_, formprodin0_.interval_mins as interval9_3_1_, formprodin0_.is_deleted as is_dele10_3_1_, formprodin0_.factory_id as factory21_3_1_, formprodin0_.pack_size as pack_si11_3_1_, formprodin0_.pack_supplier as pack_su12_3_1_, formprodin0_.reject_id as reject_13_3_1_, formprodin0_.rejected_by as rejecte14_3_1_, formprodin0_.rejected_date as rejecte15_3_1_, formprodin0_.remarks as remarks16_3_1_, formprodin0_.session_id as session17_3_1_, formprodin0_.start_date as start_d18_3_1_, formprodin0_.start_time as start_t19_3_1_, formprodin0_.status as status20_3_1_, applookup1_.lookup_id as lookup_i1_0_0_, applookup1_.lookup_desc as lookup_d2_0_0_, applookup1_.lookup_name as lookup_n3_0_0_, applookup1_.lookup_type as lookup_t4_0_0_ from form_prod_index formprodin0_ left outer join app_lookup applookup1_ on formprodin0_.factory_id=applookup1_.lookup_id where formprodin0_.factory_id=?
Hibernate: select formprodin0_.index_id as index_id1_3_1_, formprodin0_.approved_by as approved2_3_1_, formprodin0_.approved_date as approved3_3_1_, formprodin0_.break_time_mins as break_ti4_3_1_, formprodin0_.created_by as created_5_3_1_, formprodin0_.created_date as created_6_3_1_, formprodin0_.end_date as end_date7_3_1_, formprodin0_.end_time as end_time8_3_1_, formprodin0_.interval_mins as interval9_3_1_, formprodin0_.is_deleted as is_dele10_3_1_, formprodin0_.factory_id as factory21_3_1_, formprodin0_.pack_size as pack_si11_3_1_, formprodin0_.pack_supplier as pack_su12_3_1_, formprodin0_.reject_id as reject_13_3_1_, formprodin0_.rejected_by as rejecte14_3_1_, formprodin0_.rejected_date as rejecte15_3_1_, formprodin0_.remarks as remarks16_3_1_, formprodin0_.session_id as session17_3_1_, formprodin0_.start_date as start_d18_3_1_, formprodin0_.start_time as start_t19_3_1_, formprodin0_.status as status20_3_1_, applookup1_.lookup_id as lookup_i1_0_0_, applookup1_.lookup_desc as lookup_d2_0_0_, applookup1_.lookup_name as lookup_n3_0_0_, applookup1_.lookup_type as lookup_t4_0_0_ from form_prod_index formprodin0_ left outer join app_lookup applookup1_ on formprodin0_.factory_id=applookup1_.lookup_id where formprodin0_.factory_id=?
Hibernate: select formprodin0_.index_id as index_id1_3_1_, formprodin0_.approved_by as approved2_3_1_, formprodin0_.approved_date as approved3_3_1_, formprodin0_.break_time_mins as break_ti4_3_1_, formprodin0_.created_by as created_5_3_1_, formprodin0_.created_date as created_6_3_1_, formprodin0_.end_date as end_date7_3_1_, formprodin0_.end_time as end_time8_3_1_, formprodin0_.interval_mins as interval9_3_1_, formprodin0_.is_deleted as is_dele10_3_1_, formprodin0_.factory_id as factory21_3_1_, formprodin0_.pack_size as pack_si11_3_1_, formprodin0_.pack_supplier as pack_su12_3_1_, formprodin0_.reject_id as reject_13_3_1_, formprodin0_.rejected_by as rejecte14_3_1_, formprodin0_.rejected_date as rejecte15_3_1_, formprodin0_.remarks as remarks16_3_1_, formprodin0_.session_id as session17_3_1_, formprodin0_.start_date as start_d18_3_1_, formprodin0_.start_time as start_t19_3_1_, formprodin0_.status as status20_3_1_, applookup1_.lookup_id as lookup_i1_0_0_, applookup1_.lookup_desc as lookup_d2_0_0_, applookup1_.lookup_name as lookup_n3_0_0_, applookup1_.lookup_type as lookup_t4_0_0_ from form_prod_index formprodin0_ left outer join app_lookup applookup1_ on formprodin0_.factory_id=applookup1_.lookup_id where formprodin0_.factory_id=?

据我了解,我的主模型的 SELECT 查询不应该运行,因为这是一个新对象。这只是一种查找类型,如果我添加“line”和“pack_mat”,查询会变长,页面加载也会变长。知道如何解决这个问题吗?

【问题讨论】:

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


    【解决方案1】:

    您需要使用EntityGraph 来减少查询次数。

    @Entity
    @Table(name = "App_Lookup")
    @NamedEntityGraph(name = "graph.AppLookup.FormProdIndex", attributeNodes = { @NamedAttributeNode(value = "FormProdIndexFactory") })
    public class AppLookup {
     
        @Id
        @GeneratedValue
        @Column(name = "Lookup_Id", nullable = false)
        private Long lookupId;
     
        @Column(name = "Lookup_type", length = 30, nullable = false)
        private String lookupType;
     
        @Column(name = "Lookup_Name", length = 30, nullable = false)
        private String lookupName;
    
        @OneToOne(mappedBy = "lookupFactory")
        @Fetch(FetchMode.JOIN)
        private FormProdIndex FormProdIndexFactory;
    
        // getter and setter
    }
    

    在您的存储库中使用此图

    @Repository
    public interface AppLookupRepository extends CrudRepository<AppLookup, Long> {
    
        @EntityGraph(value = "graph.AppLookup.FormProdIndex", type = EntityGraphType.FETCH)
        public Optional<AppLookup> findByLookupTypeIsAndLookupIdIs(String lookupType, Long lookupId);
    
    }
    

    你可以在这里找到更多
    https://www.baeldung.com/spring-data-jpa-named-entity-graphs
    Why we need to use entity graph?

    【讨论】:

      猜你喜欢
      • 2020-10-09
      • 2018-11-03
      • 2016-01-31
      • 2020-03-29
      • 2018-10-31
      • 2016-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多