У меня есть объект 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)
}