package com.bohuikeji.frame.module.admin.annotation;

import com.bohuikeji.frame.module.admin.base.EntityBase;
import java.lang.annotation.*;

/**
 * 外键处理注解
 * @author 10552
 */
@Target({ElementType.FIELD})
@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface TableKeyField {


    /**
     * 外键指定表名
     * 【释】适用于数据库表没有对应实体，或无法通过实体关联数据表的情况，通过该属性设置外键
     * 【注】当同时设置'key()'属性和'table()'时，优先使用'table()'
     * @return
     */
    String table() default "";

    /**
     * 添加指定外键，默认EntityBase无外键
     * 【注】如单个字段数据种存在指向多个外键，请配配置judgeField判断字段名称，且judgeField字段必须存储表名称
     * 【警】key属性在性能上大大低于table属性，推荐使用table
     * @return 指向数据实体的Class
     */
    Class<? extends EntityBase> key() default EntityBase.class;

    /**
     * 判断列
     * @return
     */
    String judgeField() default "";

    /**
     * 外键查询携带的where条件
     * 【例】user_type='用户' and user_sex='男'
     * 【注】此处sql应尽量简洁，复杂sql请依赖程序逻辑实现
     * @return
     */
    String where() default "";

    /**
     * 外键展示字段，通常为xxxName字段
     * 【注】java实体字段名称，非数据库列名！！
     * @return
     */
    String[] keyShowFields() default {};

    /**
     * 模糊查询字段
     * 【注】java实体字段名称，非数据库列名！！
     * @return
     */
    String[] keyLikeFields() default {};

    /**
     * 外键多字段展示字段之间的分隔符
     * @return
     */
    String symbol() default "|";

}
