troyzhxu / bean-searcher

🔥🔥🔥 A read-only ORM focusing on advanced query, naturally supports joined tables, and avoids DTO/VO conversion, making it possible to realize complex query in one line of code !
https://bs.zhxu.cn
Apache License 2.0
1.31k stars 146 forks source link

当实体有sort字段,按字段排序,会返回空数据 #106

Closed cwchen0201 closed 2 months ago

cwchen0201 commented 2 months ago

错误描述

当sort字段用于排序 ?sort=sort&orderBy=asc,会返回空数据

实体类

@Data
@SearchBean(tables ="tb_resource")
@CheckAuthentication
public class AuthResourceByCurrentUserSearch {

    @DbField("resource_id")
    private String resourceId;

    @DbField("sort")
    private int sort;
}

错误信息

cn.zhxu.bs.implement.BaseSearcher - Empty data will be returned, because of illegal params detected: [Field type is INT, but the param value is: sort]

troyzhxu commented 2 months ago

现象分析

该现象出现的原因是因为 sort 在本例中既是一个 字段参数,又是一个默认的 排序参数,而它作为字段参数时,它在实体类中的类型是 int, 而你传的却是一个不可转换为 int 的字符串值, 所以会报这个错。

参考:

解决方案 1

如果 sort 字段不需要参与 WHERE 条件:

@DbField(conditional = false)
private int sort;

该方案让 sort 参数只作为排序参数,不再是字段参数。前端传参方式不变。

参考:https://bs.zhxu.cn/guide/advance/safe.html#%E6%9D%A1%E4%BB%B6%E7%BA%A6%E6%9D%9F

解决方案 2

重新定义排序参数名,添加配置:

bean-searcher.params.sort = sortField

前端传参修改为:? sortField=sort & orderBy=asc 影响范围:所有需要排序的 Bean Searcher 接口

解决方案 3

使用参数构建器的排序方法:

@GetMapping("/xxx")
public SearchResult<XxxVO> xxx(String sortField) {
    var params = MapUtils.builder()..orderBy(XxxVO::getSort).build()
    return beanSearcher.search(XxxVO.class, params);
}

前端传参修改为:? sortField=sort & orderBy=asc 影响范围:本接口

解决方案 4

重命名检索实体类中的 sort 属性名(数据库层的表字段名可不变):

@DbField("sort")
private int sortInt;

前端传参修改为:? sort=sortInt & orderBy=asc 影响范围:本接口