带有命名实体图的 Spring Data JPA 可分页

问题描述 投票:0回答:2

我使用 Spring 数据与 JPA 2.1 使用以下方法检索具有分页和规范(条件生成器)的实体:

Page<T> findAll(Specification<T> spec, Pageable pageable)

我如何在此方法上指定

@EntityGraph
?现在,如果我用
@EntityGraph
进行注释,Spring 将停止分页并一次性获取整个数据。

spring jpa spring-data
2个回答
1
投票

@EqualsAndHashCode(callSuper = true)
@Data
@Entity
@Table(name = "cd_order")
@Where(clause = "deleted = " + UN_DELETED)
@NamedEntityGraphs(value = {
        @NamedEntityGraph(name = "findAll", attributeNodes =
                {@NamedAttributeNode(value = "company"),
                        @NamedAttributeNode(value = "partnerCompany"),
//                   remove one to many ,   @NamedAttributeNode(value = "orderOssUrls"),
                        @NamedAttributeNode(value = "patient")
                })}
)
public class Order extends BaseEntity {

    @Column(name = "patient_id", insertable = false, updatable = false, columnDefinition = " BIGINT NOT NULL  COMMENT '订单id' ")
    private Long patientId;

    @OneToOne(fetch = FetchType.EAGER)
    @Fetch(FetchMode.JOIN)
    @NotFound(action = NotFoundAction.IGNORE)
    @JoinColumn(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT), name = "patient_id", referencedColumnName = "id")
    private Patient patient;

    @Column(name = "patient_name", columnDefinition = " VARCHAR(48) COMMENT '案例编号' ")
    private String patientName;

    @Column(name = "case_code", columnDefinition = " VARCHAR(48) NOT NULL  COMMENT '案例编号' ")
    private String caseCode;

    @Column(name = "company_id", insertable = false, updatable = false, columnDefinition = " BIGINT  COMMENT 'companyId' ")
    private Long companyId;

    @OneToOne(fetch = FetchType.EAGER)
    @Fetch(FetchMode.JOIN)
    @JoinColumn(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT), name = "company_id", referencedColumnName = "id")
    @NotFound(action = NotFoundAction.IGNORE)
    private Company company;

    @Column(name = "partner_company_id", insertable = false, updatable = false, columnDefinition = " BIGINT  COMMENT '合作伙伴的companyId' ")
    private Long partnerCompanyId;

    @OneToOne(fetch = FetchType.EAGER)
    @Fetch(FetchMode.JOIN)
    @JoinColumn(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT), name = "partner_company_id", referencedColumnName = "id")
    @NotFound(action = NotFoundAction.IGNORE)
    private Company partnerCompany;

    @Column(name = "order_id", columnDefinition = " BIGINT NOT NULL  COMMENT '订单id' ")
    private Long orderId;

    @Fetch(FetchMode.JOIN)
    @NotFound(action = NotFoundAction.IGNORE)
    @JoinColumn(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT), name = "order_id", referencedColumnName = "order_id")
    @OneToMany(fetch = FetchType.LAZY)
    private List<OrderOssUrl> orderOssUrls;

    @Column(name = "recovery_info", columnDefinition = " VARCHAR(128)  COMMENT '恢复信息' ")
    private String recoveryInfo;

    /**
     * 交货日期
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    @Column(name = "submit_time", columnDefinition = "  datetime COMMENT '请求交货日期' ")
    private LocalDateTime submitTime;

    /**
     * 订购日期
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    @Column(name = "order_time", columnDefinition = "  datetime COMMENT '订购日期' ")
    private LocalDateTime orderTime;

    /**
     * 扫描日期
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    @Column(name = "scan_time", columnDefinition = "  datetime COMMENT '扫描日期' ")
    private LocalDateTime scanTime;

    @Enumerated(value = EnumType.STRING)
    @Column(name = "order_type", columnDefinition = " VARCHAR(20) NOT NULL COMMENT '订单类型' ")
    private OrderTypeEnum orderType;

    @Enumerated(value = EnumType.STRING)
    @Column(name = "cc_order_status", columnDefinition = " VARCHAR(20)   COMMENT '诊所订单状态' ")
    private OrderStatusEnum ccOrderStatus;

    @Enumerated(value = EnumType.STRING)
    @Column(name = "lab_order_status", columnDefinition = " VARCHAR(20)   COMMENT '工厂订单状态' ")
    private OrderStatusEnum labOrderStatus;

    /**
     * @param orderType 订单类型
     */
    public void init(@NonNull OrderTypeEnum orderType) {
        generateCaseCode();

        if (orderType == OrderTypeEnum.CLINIC) {
            this.setCcOrderStatus(OrderStatusEnum.NEW);
        } else {
            this.setLabOrderStatus(OrderStatusEnum.NEW);
        }
        this.setOrderType(orderType);
        this.setOrderId(GlobalUniqueIdGeneratorUtils.generateOrderId());
    }

    /**
     * 设置案例编号
     */
    private void generateCaseCode() {
        this.setCaseCode(getYMDStrCurrently() + "-" + this.getPatient().getName());
    }

}


public interface OrderRepository extends BaseRepository<Order, Long> {


    @NonNull
    @EntityGraph(value = "findAll", type = EntityGraph.EntityGraphType.LOAD)
    Page<Order> findAll(Specification<Order> specification, @NonNull Pageable pageable);
}

sql

select order0_.id                   as id1_5_0_,
       patient1_.id                 as id1_9_1_,
       company2_.id                 as id1_1_2_,
       company3_.id                 as id1_1_3_,
       order0_.create_time          as create_t2_5_0_,
       order0_.deleted              as deleted3_5_0_,
       order0_.update_time          as update_t4_5_0_,
       order0_.version              as version5_5_0_,
       order0_.case_code            as case_cod6_5_0_,
       order0_.cc_order_status      as cc_order7_5_0_,
       order0_.company_id           as company_8_5_0_,
       order0_.lab_order_status     as lab_orde9_5_0_,
       order0_.order_id             as order_i10_5_0_,
       order0_.order_time           as order_t11_5_0_,
       order0_.order_type           as order_t12_5_0_,
       order0_.partner_company_id   as partner13_5_0_,
       order0_.patient_id           as patient14_5_0_,
       order0_.patient_name         as patient15_5_0_,
       order0_.recovery_info        as recover16_5_0_,
       order0_.scan_time            as scan_ti17_5_0_,
       order0_.submit_time          as submit_18_5_0_,
       patient1_.create_time        as create_t2_9_1_,
       patient1_.deleted            as deleted3_9_1_,
       patient1_.update_time        as update_t4_9_1_,
       patient1_.version            as version5_9_1_,
       patient1_.activity_time      as activity6_9_1_,
       patient1_.day                as day7_9_1_,
       patient1_.email              as email8_9_1_,
       patient1_.month              as month9_9_1_,
       patient1_.name               as name10_9_1_,
       patient1_.note               as note11_9_1_,
       patient1_.phone              as phone12_9_1_,
       patient1_.sex                as sex13_9_1_,
       patient1_.year               as year14_9_1_,
       company2_.create_time        as create_t2_1_2_,
       company2_.deleted            as deleted3_1_2_,
       company2_.update_time        as update_t4_1_2_,
       company2_.version            as version5_1_2_,
       company2_.additional_info_id as addition6_1_2_,
       company2_.address            as address7_1_2_,
       company2_.biz_type           as biz_type8_1_2_,
       company2_.cell_phone         as cell_pho9_1_2_,
       company2_.city               as city10_1_2_,
       company2_.country_code       as country11_1_2_,
       company2_.country_name       as country12_1_2_,
       company2_.description        as descrip13_1_2_,
       company2_.icon               as icon14_1_2_,
       company2_.language           as languag15_1_2_,
       company2_.mechanism_id       as mechani16_1_2_,
       company2_.name               as name17_1_2_,
       company2_.office_phone       as office_18_1_2_,
       company2_.postcode           as postcod19_1_2_,
       company2_.province           as provinc20_1_2_,
       company2_.time_zone          as time_zo21_1_2_,
       company3_.create_time        as create_t2_1_3_,
       company3_.deleted            as deleted3_1_3_,
       company3_.update_time        as update_t4_1_3_,
       company3_.version            as version5_1_3_,
       company3_.additional_info_id as addition6_1_3_,
       company3_.address            as address7_1_3_,
       company3_.biz_type           as biz_type8_1_3_,
       company3_.cell_phone         as cell_pho9_1_3_,
       company3_.city               as city10_1_3_,
       company3_.country_code       as country11_1_3_,
       company3_.country_name       as country12_1_3_,
       company3_.description        as descrip13_1_3_,
       company3_.icon               as icon14_1_3_,
       company3_.language           as languag15_1_3_,
       company3_.mechanism_id       as mechani16_1_3_,
       company3_.name               as name17_1_3_,
       company3_.office_phone       as office_18_1_3_,
       company3_.postcode           as postcod19_1_3_,
       company3_.province           as provinc20_1_3_,
       company3_.time_zone          as time_zo21_1_3_
from cd_order order0_
         left outer join cd_patient patient1_ on order0_.patient_id = patient1_.id
         left outer join cd_company company2_ on order0_.partner_company_id = company2_.id
         left outer join cd_company company3_ on order0_.company_id = company3_.id
where (order0_.deleted = 0)
  and order0_.order_id >= 1
  and (order0_.case_code like '%case%')
  and patient1_.year >= 1
  and patient1_.month >= 1
  and patient1_.day >= 1
  and patient1_.sex = 'MALE'
  and (patient1_.phone like '%phone%')
  and (patient1_.name like '%name%')
  and (order0_.update_time between '2021-06-23 14:40:53.101831' and '2021-06-27 14:40:53.101944')
order by order0_.create_time asc, order0_.submit_time desc
limit 10

-1
投票

请删除多个@NamedAttributeNode image 1 并尝试调试 org.hibernate.hql.internal.ast.QueryTranslatorImpl image 2 。请关心 RowSelection。我修复了“bug”

© www.soinside.com 2019 - 2024. All rights reserved.