Как обрабатывать страницы и сортировку Spring Data JPA вручную? - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть объект Property, который я хочу получить из базы данных, если он попадает в данный географический многоугольник.Одним из полей Property является класс с именем LeaseTransaction, который имеет более подробную информацию, относящуюся к свойству.Одно свойство может иметь несколько транзакций аренды, поэтому оно имеет тип Set.

Если я пытаюсь использовать разбиение по страницам и сортировку по любому из полей, которые появляются в LeaseTransaction, выдается сообщение об ошибке:

 illegal attempt to dereference collection [intakeprop0_.id.intakeLeaseTransactions] with element property reference 

Текущий запрос, который я запускаю с помощью спящего режима, являетсясобственный запрос, который обрабатывает нумерацию страниц, но не сортировку (из-за проблемы, указанной выше).Могу ли я что-нибудь сделать, чтобы вручную выполнить сортировку после получения всех свойств из поиска?

Запрос:

@Query(value="SELECT i FROM IntakeProperty i WHERE ST_WITHIN(i.address.point, (:searchArea)) = true")
Page<IntakeProperty> findAllByPolygon(@Param("searchArea") Polygon searchArea, Pageable pageable);

Свойство:

@Entity
@Table(name = "INTAKE_PROPERTY", schema = "LDT")
class IntakeProperty extends BaseDomain {

  @Column(name='building_placement')
  BuildingPlacementEnum buildingPlacement
  @Column(name='drive_thru')
  Boolean driveThru
  @Column(name='legal_tax_parcel_id')
  String legalTaxParcelId
  @Column(name='landlord_owner_name')
  String landlordOwnerName
  @Column(name='msa')
  String msa
  @Column(name='property_name')
  String propertyName
  @Deprecated  //This is temporarily being used to
  @Column(name='property_sub_type')
  String propertySubType
  @Column(name='property_type')
  REPropertyTypeEnum propertyType
  @Column(name='status')
  IntakePropertyStatusEnum status
  @Column(name='sub_market')
  String subMarket
  @Column(name='total_tenant_net_rentable_area')
  Integer totalTenantNetRentableArea
  @Column(name='year_built')
  Integer yearBuilt
  @Column(name='year_renovated')
  Integer yearRenovated

  @Transient
  Boolean nonSpecificIncluded = false

  @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
  @JoinColumn(name = "ADDRESS_ID")
  Address address

  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
  @JoinColumn(name = "INTAKE_PROPERTY_ID")
  List<IntakeLeaseTransaction> intakeLeaseTransactions

Арендная транзакция:

 @Entity
    @Table(name = "INTAKE_LEASE_TRANSACTION", schema = "LDT")
    class IntakeLeaseTransaction extends BaseDomain {

        @Column(name='broker_contact_info')
        String brokerContactInfo
        @Column(name='cam_per_sq_ft_per_year')
        Double camPerSqFtPerYear
        @Column(name='clear_height')
        Integer clearHeight
        @Column(name='comments')
        String comments
        @Column(name='floor_location')
        Integer floorLocation
        @Column(name='initial_rent_per_sq_ft')
        Double initialRentPerSqFt
        @Column(name='leasing_commission')
        String leasingCommission
        @Column(name='lease_contract_status')
        LeaseContractStatusEnum leaseContractStatus
        @Column(name='lease_execution_date')
        Date leaseExecutionDate
        @Column(name='lease_start_date')
        Date leaseStartDate
        @Column(name='lease_transaction_type')
        LeaseTransactionTypeEnum leaseTransactionType
        @Column(name='lease_type')
        LeaseTypeEnum leaseType
        @Column(name='months_free')
        Integer monthsFree
        @Column(name='percent_office_finish')
        Integer percentOfficeFinish
        @Column(name='rent_escalations')
        String rentEscalations
        @Column(name='suite_number')
        String suiteNumber
        @Column(name='taxes_per_sq_ft_per_year')
        Double taxesPerSqFtPerYear
        @Column(name='tenant_name')
        String tenantName
        @Column(name='tenant_net_rentable_area')
        Integer tenantNetRentableArea
        @Column(name='term_in_months')
        Integer termInMonths
        @Column(name='tis_per_sq_ft')
        Double tisPerSqFt
        @Column(name='total_taxes_cam_per_sq_ft_per_year')
        Double totalTaxesCAMPerSqFtPerYear
        @Column(name='verification_type')
        String verificationType

        @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
        @JoinColumn(name = "INTAKE_LEASE_TRANSACTION_ID")
        List<LeaseSpaceType> leaseSpaceTypes

        @ManyToMany(cascade = [CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH], fetch=FetchType.EAGER)  // Not including REMOVE)
        @JoinTable(schema="ldt", name = "lease_source_document", joinColumns = @JoinColumn(name = "intake_lease_transaction_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "source_document_id", referencedColumnName = "id"))
        Set<SourceDocument> sourceDocuments
     ...
    }

Это обычный запрос страницы, который работает с findAll:

private Pageable createPageRequest(final Integer page, final Integer pageSize, final String sortFieldName, final Sort.Direction direction) {
final int start = page ?: DEFAULT_PAGE
final int size = pageSize ?: DEFAULT_PAGE_SIZE
final String sortBy = sortFieldName ?: DEFAULT_SORT_FIELD
final Sort.Direction sortDirection = direction ?: DEFAULT_SORT_DIRECTION
return new PageRequest(start, size, new Sort(sortDirection, sortBy))

}

Это модифицированный, который я должен использоватьсейчас:

private Pageable createPolygonPageRequest(final Integer page, final Integer pageSize) {
    final int start = page ?: DEFAULT_PAGE
    final int size = pageSize ?: DEFAULT_PAGE_SIZE
    return new PageRequest(start, size)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...