在具有多对一引用的类上进行分页和排序的问题

时间:2018-12-19 22:29:11

标签: java spring hibernate hql

我有一个API端点,该端点在地图上采用多边形形状,并返回该形状内的商家列表。搜索的方法如下所示:

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

数据可以很好地返回前端,但是问题在于对数据进行排序。

此IntakeProperty实体上有许多属性,其中一个是IntakeLeaseTransactions列表。这些租赁交易包含与该物业有关的大部分信息,这些信息出现在前端。 IntakeProperty与IntakeLeaseTransaction具有一对多关系。

暂时搁置多边形,如果我通过常规的findAll(Pageable)调用对所有属性进行常规搜索,则可以对显示的所有属性进行排序:直接来自IntakeProperty的属性及其相关的IntakeLeaseTransaction。但是,当我使用自定义查询时,我只能按直接在IntakeProperty上的列对数据进行排序。当我想按相关IntakeLeaseTransaction实体上的列排序时,出现错误:

org.hibernate.QueryException: illegal attempt to dereference collection [intakeprop0_.id.intakeLeaseTransactions] with element property reference [tenantNetRentableArea] [SELECT i FROM com.ldt.domain.IntakeProperty i WHERE ST_WITHIN(i.address.point, (:searchArea)) = true order by i.intakeLeaseTransactions.tenantNetRentableArea asc];

这是模板,只需将TenantNetRentableArea替换为我要排序的IntakeLeaseTransaction的任何属性,这就是我要得到的错误。

如果我理解该错误,则问题在于IntakeProperty中的IntakeLeaseTransaction是一个列表,即使只有1个元素,它也无法知道该列表中的哪个元素来获取其需要排序的字段列表中的项目。

如何在将IntakeLeaseTransaction保持为IntakeProperty类的List类型的同时解决此问题?

0 个答案:

没有答案