V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Vimax
V2EX  ›  Java

Java 通用方法如何设置传不同实体的参数

  •  1
     
  •   Vimax · 2020-08-08 13:34:21 +08:00 · 3117 次点击
    这是一个创建于 1349 天前的主题,其中的信息可能已经有所发展或是发生改变。

    通用查询实体:

    public class BaseQueryInfo {
    
        private Integer pageNum;
        private Integer pageSize;
        private String orderBy;
        private String orderType;
        private String searchKey;
    
    }
    

    学生 DTO:

    public class StudentQueryDTO extends BaseQueryInfo {
    
    	private String name;
        private String age;
    }
    

    老师 DTO:

    public class TeachQueryDTO extends BaseQueryInfo {
    
    	private String name;
        private String age;
    }
    

    分页排序工具类: 这里应该如何设置入参参数,可以让其同时支持 TeachQueryDTO 和 StudentQueryDTO

    
        public static void pageAndOrderBy(StudentQueryDTO studentDto) {
            PageHelper.startPage(studentDto.getPageNum(), studentDto.getPageSize());
         
            if (StringUtils.isNotBlank(studentDto.getOrderBy()) && StringUtils.isNotBlank(studentDto.getOrderType())) {
                if (OrderType.DESC.getKey().equals(studentDto.getOrderType())) {
                    PageHelper.orderBy(studentDto.getOrderBy() + " desc");
                } else if (OrderType.ASC.getKey().equals(studentDto.getOrderType())) {
                    PageHelper.orderBy(studentDto.getOrderBy());
                }
            }
        }
    ```
    
    14 条回复    2020-08-09 08:12:36 +08:00
    Jooooooooo
        1
    Jooooooooo  
       2020-08-08 13:40:27 +08:00
    没看懂问题

    直接问了, 把参数从 StudentQueryDTO studentDto 改成 BaseQueryInfo queryInfo 的问题是?
    Vimax
        2
    Vimax  
    OP
       2020-08-08 13:47:36 +08:00
    @Jooooooooo 不是,我让让`public static void pageAndOrderBy(StudentQueryDTO studentDto)`这个方法,同时支持继承了 BaseQueryInfo 的实体,做为参数。

    比如:
    `public static void pageAndOrderBy(StudentQueryDTO studentDto)`,
    `public static void pageAndOrderBy(TeacherQueryDTO teacherDto)`

    凡是后面继承了 BaseQueryInfo 的对象,都可以使用这个方法。public static void pageAndOrderBy(? ?)
    不晓的? ?可以的应该如何定义,让其具备通用。
    Jooooooooo
        3
    Jooooooooo  
       2020-08-08 13:52:50 +08:00   ❤️ 1
    ? ? 写成 BaseQueryInfo queryInfo 会怎么样?
    xgfan
        4
    xgfan  
       2020-08-08 14:40:11 +08:00
    Java 的“面向对象”,“设计模式”学魔怔了吗。直接用 BaseQueryInfo 作为传参不就完了?
    而且,有必要这样分 Teacher 和 Student 吗?
    Sharuru
        5
    Sharuru  
       2020-08-08 14:56:13 +08:00   ❤️ 1
    泛型通配符可以了解一下。
    <T extends BaseQueryInfo>
    serical
        6
    serical  
       2020-08-08 15:34:11 +08:00   ❤️ 1
    public static <T, R extends Comparable<R>> T[] sort(T[] array, Function<T, R> function) {
    Arrays.stream(array)
    .sorted(Comparator.comparing(function))
    .collect(Collectors.toList()).toArray(array);
    return array;
    }



    具体的: https://blog.serical.net/object-sort
    aguesuka
        7
    aguesuka  
       2020-08-08 17:01:54 +08:00   ❤️ 1
    public class BaseQueryInfo<T extends BaseQueryInfo> {

    private Integer pageNum;
    private Integer pageSize;
    private String orderBy;
    private String orderType;
    private String searchKey;
    public void pageAndOrderBy(T studentDto) {
    PageHelper.startPage(studentDto.getPageNum(), studentDto.getPageSize());

    if (StringUtils.isNotBlank(studentDto.getOrderBy()) && StringUtils.isNotBlank(studentDto.getOrderType())) {
    if (OrderType.DESC.getKey().equals(studentDto.getOrderType())) {
    PageHelper.orderBy(studentDto.getOrderBy() + " desc");
    } else if (OrderType.ASC.getKey().equals(studentDto.getOrderType())) {
    PageHelper.orderBy(studentDto.getOrderBy());
    }
    }
    }
    }
    Vimax
        8
    Vimax  
    OP
       2020-08-08 18:22:06 +08:00
    @xgfan ```有必要这样分 Teacher 和 Student 吗```,可以具体说说吗?
    上面的 teacher 和 student 是个例子,比如我业务中有很多对象都需要做分页查询,对象里的属性都不相一样。如果不用对象 queryDTO 继承分页排序实体,请教如何写比较好?谢谢。
    Vimax
        9
    Vimax  
    OP
       2020-08-08 18:24:16 +08:00
    @Vimax 补充下:是分页和条件查询。
    Kirsk
        10
    Kirsk  
       2020-08-08 18:31:03 +08:00 via Android   ❤️ 2
    写一个分页类 把你的数据对象 set 进去 比如 T data setdata 用泛型 网上太多了 百度下就有 继承能少用就别用 灵活性比组件差多了
    Vimax
        11
    Vimax  
    OP
       2020-08-08 18:35:27 +08:00
    @Kirsk 但是这样,我需要用两个对象接收前端的参数吧。
    一个对象接收条件,接收对象属性作为条件。
    一个对象接收分页信息,然后再把条件对象做为属性 set 到分页对象中。
    cedoo22
        12
    cedoo22  
       2020-08-08 19:08:38 +08:00
    @Vimax 这是问题吗? 觉得不行也可以自己转换参数
    Kirsk
        13
    Kirsk  
       2020-08-09 08:10:18 +08:00 via Android
    @Vimax 昨天没有细看 如果都是单表查且数据对象只作为查询条件 那就不需要泛型了 用数组就行 然后用动态查 组织好条件。如果不是就用泛型 将 data 的数据转成对应的类 这一步比较恶心
    Kirsk
        14
    Kirsk  
       2020-08-09 08:12:36 +08:00 via Android
    噢 没法用数组忘了是对象 比较好的解决办法就是动态查了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4429 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 01:05 · PVG 09:05 · LAX 18:05 · JFK 21:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.