For the complete documentation index, see llms.txt. This page is also available as Markdown.

视图对象

复杂查询通常涉及多个表的连接和列的聚合操作。虽然查询对象可以复用来构造WHERE子句,但实体对象无法完整表达查询的其他部分。因此,我们引入专门的视图对象来定义复杂查询中的静态部分,同时引入单独的Having对象用于生成HAVING子句。此外,视图对象也作为结果映射的目标。

为了实现复杂查询的自动映射,我们将映射过程划分为以下三部分:

  1. 列映射:视图对象中定义的字段用于映射查询结果中的所需列,包括普通列和聚合列。

  2. 连接映射:视图对象中的注解用于定义表之间的关系,支持自动生成必要的连接语句。

  3. HAVING子句映射:Having对象用于生成HAVING子句,支持基于聚合结果的过滤条件。

该设计不仅提高了开发者构造和维护复杂查询语句的效率,也减少了手动拼装SQL带来的风险,显著提升了代码的可读性、可重用性和可维护性。

聚合查询接口

除了为单表数据访问设计接口外,还需为聚合查询设计单独接口。

设计并实现了接口 AggregateClient,定义如下: 该接口提供通用方法 query,允许开发者通过指定目标视图类和查询对象执行聚合查询,结果映射为对应视图对象列表。

public interface AggregateClient {
    <V> AggregateChain<V> aggregate(Class<V> viewClass);

    default <V> List<V> query(Class<V> viewClass, DoytoQuery query) {
        return aggregate(viewClass).filter(query).query();
    }

    default <V> long count(Class<V> viewClass, DoytoQuery query) {
        return aggregate(viewClass).filter(query).count();
    }

    default <V> PageList<V> page(Class<V> viewClass, DoytoQuery query) {
        return aggregate(viewClass).filter(query).page();
    }
}

最后更新于