LambdaQueryWrapper方法引用转数据库字段原理

文章详细解释了在使用LambdaQueryWrapper进行数据库操作时,如何通过方法引用如User::getOrgId来指定查询字段。尽管传入的是SFunction,但实际上是利用了Java的序列化机制,将方法引用转换为SerializedLambda类,从中获取方法和类的信息,从而映射到对应的数据库字段。
摘要由CSDN通过智能技术生成

LambdaQueryWrapper或其他Lambda相关的类中,有很多SFunction类,

public final LambdaQueryWrapper<T> select(SFunction<T, ?>... columns) {
        if (ArrayUtils.isNotEmpty(columns)) {
            this.sqlSelect.setStringValue(columnsToString(false, columns));
        }
        return typedThis;
    }

这个类我们一般使用方法引用 User::  或者其他数据库实体类,后续跟方法,再跟参数

lambdaQuery().eq(FinancialLoanRecord::getOrgId,1).list();
@Data
@Entity
@Table(name = "financial_loan_record")
@TableName("financial_loan_record")
public class FinancialLoanRecord extends BaseEntity {

    private static final long serialVersionUID = -2943947768036673473L;

    @ApiModelProperty(value = "机构id")
    @Column(columnDefinition = "varchar(24) comment '机构id'")
    private String orgId;

    @ApiModelProperty(value = "基地id")
    @Column(columnDefinition = "varchar(24) comment '基地id'")
    private String baseId;


}

那么,为什么明明传值getOrgId的方法引用,实际传的类是SFunction 会识别到是哪个数据库字段呢?  

 首先,我们要了解一个概念,就是lambda的方法引用在序列化的时候,会序列化为SerializedLambda类,万物皆对象。

该类有类和方法名称信息

public final class SerializedLambda implements Serializable {
    private static final long serialVersionUID = 8025925345765570181L;
    private final Class<?> capturingClass;
    private final String functionalInterfaceClass;
    private final String functionalInterfaceMethodName;
    private final String functionalInterfaceMethodSignature;
    private final String implClass;
    private final String implMethodName;
    private final String implMethodSignature;
    private final int implMethodKind;
    private final String instantiatedMethodType;
    private final Object[] capturedArgs;
 }

于是,我们就能得知 虽然传值的是SFunction,但是实际上的类是SerializedLambda,这也就是为什么SFunction会有序列化接口的原因。

@FunctionalInterface
public interface SFunction<T, R> extends Function<T, R>, Serializable {
}

能找到哪个方法,哪个类,哪就肯定能找到对应的数据库字段名称。

Lambda表达式的一些有趣玩法_顾人间讥诘的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值