通过 Bean Searcher 在数据库中对数据的排序
想要H5页面中实现升序,降序的排序功能 :
问题 :
点击排序按钮只可以降序,不能升序
问题代码 :
原因 :
小于0时无法排序, 原因是返回值为 int 类型, 小于0的值变为0,所以无法排序
但是在解决这个问题同时发现了另外一个问题, 因为要做分页处理(每页数据为15条), 数据超过15条数据时, 那么排序只会排当前页查到的数据, 前面页码数据不参与排序
所以需要在数据库中排序 而不能在 代码中排序(在代码中排序需要将所有数据全部查询出来, 数据过大时会对数据产生影响,不建议使用)
代码 :
1 @Secured('permitAll') 2 def piles(Integer page, Integer size, String searchTerm, String sort, String order, Boolean online) { 3 ... 7 def user = securityService.currUser 8 def piles = ChargePile.createCriteria().list { 9 ...46 }.collect { Object[] it -> 47 def pileId = it[0] 48 def pile = ChargePile.load(pileId as Long) 49 def pileReport = PileReport.createCriteria().get { 50 eq 'type', ModelConst.REPORT__TYPE__DATE 51 eq 'time', TimeUtils.getYesterdayyyyyMMdd() 52 eq 'chargePile', pile 53 } as PileReport 54 [ 55 ....
64 usedRate: pileReport ? String.format('%.2f', pileReport?.useRate * 100) : '0', // 排序字段 65 income : pileReport ? String.format('%.2f', pileReport?.pileIncomeAmount / 100) : '0.00', // 排序字段 66 ] 67 } as List 68 def result = [ 69 piles: listSort(piles, sort, order), // 上述图片中方法 70 online: countPiles(ModelConst.CHARGE_PILE__STATUS__ONLINE), 71 offline: countPiles(ModelConst.CHARGE_PILE__STATUS__OFFLINE) 72 ] 73 render result as JSON
通过 Bean Searcher 在数据库中进行排序 代码如下 :
1 @SearchBean(tables = '''charge_pile p // sql语句 2 left join pile_report r on r.charge_pile_id = p.id and r.type = 1 and r.time = :time // on后面是对局部条件做限制 3 left join charge_site s on p.charge_site_id = s.id 4 left join agent a on s.agent_id = a.id ''', 5 joinCond = '''p.deleted = 0 and a.user_id = :userId and s.platform_id = :platformId and // joinCond 相当于在sql中的where, where后面是对全局做限制 6 (s.name like :search or p.pile_no like :search)''') // 实现条件搜索(设备名称或设备编号) 7 class PileReportBean implements BeanAware {44 ... 45 }
控制层代码 :
1 @Secured('permitAll') //权限 所有人可以访问 2 def piles(Integer page, Integer size, String searchTerm, String sort, String orderMode, Boolean online) { 3 .... 8 log.info("user:${user},") 9 def status = online ? 1 : 2 10 def params = [ // sql的 wehre 条件 11 platformId : PlatformHolder.loadPlatform().id, 12 time : TimeUtils.getYesterdayyyyyMMdd(), 13 userId : user.id, 14 status : status, 15 search : '%' +searchTerm + '%', // 搜索条件(通过前端传入) 16 sort : sort, // 排序字段(前端传入) 17 order : orderMode, // 排序方式(desc or asc) 18 max : size, 19 offset : page * size 20 ] 21 22 def piles = searcher.search(PileReportBean, params) 23 ...44 }
以上 方法解决 本次所遇到的 排序问题