Skip to content

核心注解

本文档解释了如何使用 Bean Searcher 的注解系统将 Java 类映射到数据库查询。它涵盖了核心注解 @SearchBean@DbField@DbIgnore,以及它们支持的类型和处理机制。

概述

Bean Searcher 使用声明式注解系统将普通的 Java 类转换为可搜索的实体。该框架在运行时分析这些注解,以生成相应的 SQL 查询、处理字段映射并管理数据库交互。

SearchBean 是任何可以与 Bean Searcher 配合使用以执行数据库搜索的 Java 类。类可以通过显式注解成为 SearchBean,也可以 @SearchBean 在省略注解时通过自动映射实现。

@SearchBean

@SearchBean 注解将类标记为可检索,并定义其数据库映射配置。如果省略此注解,Bean Searcher 将尝试根据类名和字段名进行自动映射。

核心属性

属性类型默认值含义版本
tablesString""数据库表和别名1.0
dataSourceString""数据源标识符3.0
whereString""静态 WHERE 条件3.8
fields@DbField[]""附加属性,用于动态条件4.1
groupByString""GROUP BY 子句1.0
havingString""分组查询的 HAVING 子句3.8
orderByString""默认 ORDER BY 子句3.6
autoMapToString""字段映射的默认表3.0
distinctbooleanfalse是否对结果集启用 DISTINCT1.0
inheritTypeInheritTypeDEFAULT领域继承策略3.2
ignoreFieldsString[]{}要从映射中排除的字段3.4
sortTypeSortTypeDEFAULT参数排序约束,参考3.6
timeoutint0SQL 执行最大时间(秒),0 表示不限制4.0
maxSizeint0单页最大条数,0 表示使用 全局配置值4.5
maxOffsetlong0最大分页深度,0 表示使用 全局配置值4.5

数据表映射

属性 tables 支持多种格式:

  • 单表:"users"
  • 带别名的表:"users u"
  • 多张表格:"users u, roles r, user_roles ur"
  • 复杂连接:"users u LEFT JOIN roles r ON u.role_id = r.id"

tables 为空时,Bean Searcher 会使用配置的命名策略自动将类名映射到表名。

多表映射策略

对于多表配置,可用 autoMapTo 属性指定未映射字段应指向哪个表,例如:

java
@SearchBean(
    tables = "users u, roles r", 
    where = "u.role_id = r.id",
    autoMapTo = "u"
)
public class UserWithRole {
    private Long id;         // 自动映射到 u.id
    private String name;     // 自动映射到 u.name
    @DbField("r.name")
    private String roleName; // 显式映射到 r.name
}

@DbField

注解 @DbField 可对字段到列的映射和 Bean Searcher 的检索行为进行细粒度控制。它可以应用于类字段,也可以在 @SearchBean.fields 动态条件下声明。

核心属性

属性类型默认值含义版本
valueString""SQL 列表达式1.0
nameString""字段参数名称4.1
mapToString""目标表/别名4.1
conditionalbooleantrue是否允许作为检索参数3.0
onlyOnClass[]{}检索时允许的 运算符3.0
aliasString""SQL 列别名3.5
typeDbTypeUNKNOWN数据库列类型3.8
clusterClusterAUTO聚合列标记,参考4.1

属性映射策略

该注解支持多种映射模式:

简单列映射

  1. 简单列:@DbField("name")
  2. 指定表:@DbField("r.name")
  3. 使用 mapTo@DbField(value="name", mapTo="r")

如果此属性是 字段属性,其 Java 字段名与表列名一致,则无需指定 value 属性。

  1. 列映射:@DbField(mapTo="r")

表达式映射

可以直接映射任何合法的 SQL 表示式:

  1. 列连接:@DbField("CONCAT(u.first_name, ' ', u.last_name)")
  2. 日期格式化:@DbField("date_format(date_created, '%Y-%m-%d')")
  3. 使用聚合函数:@DbField("avg(u.score)")
  4. 使用 case 表达式:@DbField("sum(case when status = 0 then 1 else 0 end)")

子查询映射

还可以直接映射到一个子查询

  1. 子查询:@DbField("(SELECT COUNT(*) FROM orders WHERE user_id = u.id)")

条件字段控制

属性 conditional 可控制字段是否可以用作搜索参数:

java
// 指定不能生成检索条件,只承载检索结果
@DbField(conditional = false)
private Date createdAt;

属性 onlyOn 可限制了条件字段允许使用的运算符:

java
// 只允许 > 和 < 运算符(第一个是默认运算符)
@DbField(onlyOn = {GreaterThan.class, LessThan.class})
private Integer age;

@DbIgnore

注解 @DbIgnore 会将某些字段从数据库映射中排除。它与 @DbField 不能标注在同一字段上。

参考:属性忽略 章节

基于 Apache 许可发布