【问题标题】:Sortable HTML table in JavaJava中的可排序HTML表格
【发布时间】:2011-11-19 08:24:37
【问题描述】:

我想为由 Hibernate 填充的 HTML 表添加排序。实际的排序必须由数据库完成。要将“Order by”条件提供给数据库,Java 必须将传递的排序参数与查询中的列相匹配。我不确定如何实现这种匹配。

我可以传递类似“Employee.salary”的内容,但是需要像从客户端传递的所有参数一样检查这个条件。这个检查需要从 Hibernate 注释中获取列名,我猜这并不容易。此外,该列可以是特定于查询的,并且不对应于表字段。

另一种方法是在表示层中使用硬编码值。但这会将表示层与持久层联系起来,我认为这也不好。

您如何处理 Web 应用程序中的服务器端排序?

【问题讨论】:

    标签: java hibernate model-view-controller


    【解决方案1】:

    您必须创建某种中间层来映射视图和表之间的列名。通过这种方式,您可以以封装形式向查询发送额外参数,并在服务器端代码中根据您的实际查询使用它们。 对于排序这样做:

    public class ColumnMapping {
        String tableColName;
        String dbColName;
        //getters, setters, ctors and anything else required
    }
    List<ColumnMapping > orderColumns = new ArrayList<ColumnMapping >();
    orderColumns.add(new ColumnMapping("foo", "bar"));
    
    //... server side
    StringBuilder queryString = new StringBuilder("select * from books ");
    if(orderingApplicable) {
       queryString.appendd("order by ");
       queryString.append(implode(orderColumns, ", "));
    }
    

    其中 implode 是一个理论函数,它将带有逗号的列表元素粘合成一个字符串。
    备注:
    如果不可变,您可以在启动时轻松预填充 view-db 映射。
    group by 也可以这样做。
    这只是一个存根,但可以扩展以包含聚合函数或您需要的任何内容

    【讨论】:

      【解决方案2】:

      如果我有一个Employee 实体,那么我想要一个EmployeeRepository,它可以让我findEmployeesBySalary(SortType sortType, int skip, int limit)

      从 web 服务端,我想要一个类似的 URI

      foo.com/employees?by=salary&skip=10&limit=50
      

      返回类似(作为 AJAX XHR 调用)

      <employees>
          <employee uri="/employee/1" />
          <employee uri="/employee/2" />
          <employee uri="/employee/3" />
      </employees>
      

      或适当渲染的完整 HTML 页面。

      这可以方便地在客户端(缓存大小灵活)和 HTTP 级别缓存员工。

      注意,列名?无关紧要。您将拥有一个HiberateEmployeeRepository,它根据需要实现EmployeeRepository 接口。将这些东西表示为方法,并在需要时使用复杂的参数。

      如果你愿意,你甚至可以有两个单独的方法,而不是一个枚举,findHighestPaidEmployeesfindLowestPaidEmployees - foo.com/employees?salary=lowest&amp;skip=10&amp;take=30 请注意,这是一个非常令人沮丧的 URI。

      【讨论】:

      • 在我的理解中,SortType 枚举是服务层 API 的一部分。所以 web 控制器必须从 URI 参数转换为 SortType 枚举
      • 是的,那个,或者如果你有不同的方法,调用哪个方法。当我使用 JAX-RS/Jersey 时,我可以通过采用 String 或 valueOf 工厂的构造函数自动将 URI 路径或查询参数编组到对象。
      【解决方案3】:

      您可以借助各种 js 工具在客户端对数据进行排序。它将最小化对数据库的请求

      【讨论】:

      • 我想让它可扩展,客户端排序不适用于大数据。
      • 我认为分页和客户端排序是两种相互冲突的技术。分页旨在减少数据传输,需要服务器端排序,而客户端排序需要将所有数据传输到客户端进行排序
      猜你喜欢
      • 2010-09-10
      • 2017-09-02
      • 2018-04-11
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      相关资源
      最近更新 更多