DoydoQuery v2
首页GitHub
简体中文
简体中文
  • 项目介绍
  • 快速上手
  • 对象概念
    • 查询对象
      • 分页排序
      • 谓词后缀字段
      • 逻辑后缀字段
      • 子查询字段
      • ER关系字段
      • 自定义查询字段
    • 实体对象
      • 枚举字段
      • 分表
    • 视图对象
      • 列映射
    • 聚合查询对象
  • 基础用法
    • 增删查改接口
    • 中间表访问接口
    • 数据库方言
    • 打印SQL日志
  • Web
    • Controller
  • Service
  • 缓存
  • 排序参数
  • 校验
  • 用户注入
  • 相关资源
    • 文章
      • 从ORM到OQM:一种基于对象的SQL语句构造方案
由 GitBook 提供支持
在本页

这有帮助吗?

  1. 对象概念
  2. 查询对象

子查询字段

对于一般的子查询条件,例如score > (SELECT avg(score) FROM t_user WHERE removed = ?),在OQM中被分为三个部分分别进行映射:

  • score >

  • SELECT avg(score) FROM t_user

  • WHERE clause

第一部分score >, 可以使用字段名scoreGtXxx来映射得到。 谓词后缀之后定义的字符串仅用于区分重复的字段名,在映射时会被忽略。

第二部分包含一个列名和一个表名,这些属于不变的静态,DoytoQuery提供了两种注解来保存这些信息:

  • @Subquery:定义子查询语句的列名和表名;

  • @SubqueryV2:定义一个视图对象,用于配合字段赋值生成子查询语句。

第三部分是另一个WHERE子句,可以通过查询对象来映射。因此,我们将字段类型定义为对应的查询对象,并通过查询对象映射方法将字段的值映射为子查询中WHERE子句。

示例

注解@Subquery:

@SuperBuilder
@NoArgsConstructor
public class UserQuery extends PageQuery {
    // ...
    
    @Subquery(select = "avg(score)", from = UserEntity.class)
    private UserQuery scoreLtAvg;

    @Subquery(select = "score", from = UserEntity.class)
    private UserQuery scoreLtAny;

    @Subquery(select = "score", from = UserEntity.class)
    private UserQuery scoreLtAll;

    @Subquery(select = "avg(score)", from = UserEntity.class)
    private UserQuery scoreGtAvg;
}

注解@SubqueryV2:

@Getter
@Setter
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class MinimumCostSupplierQuery extends PageQuery {
    private Integer p_size;
    private String p_typeEnd;
    private String r_name;
    @SubqueryV2(MinSupplyCostView.class)
    private SupplyCostQuery psSupplycost;

    @View(value = PartEntity.class, context = true)
    @View(PartsuppEntity.class)
    @View(SupplierEntity.class)
    @View(NationEntity.class)
    @View(RegionEntity.class)
    private static class MinSupplyCostView {
        @NoLabel
        private Integer minPs_supplycost;
    }
}
上一页逻辑后缀字段下一页ER关系字段

最后更新于20天前

这有帮助吗?