Java方法引用创建无法使用吗?

LambdaQueryWrapper<SysMenu> queryWrapper = Wrappers.lambdaQuery(SysMenu.class);
SFunction<SysMenu, Integer> getMenuType2 = sysMenu -> sysMenu.getMenuType();
SFunction<SysMenu, Integer> getMenuType1 = SysMenu::getMenuType;
SFunction<SysMenu, Integer> getMenuType = new SFunction<>() {
            @Serial
            private static final long serialVersionUID = 4693707598369533353L;

            @Override
            public Integer apply(SysMenu sysMenu) {
                return sysMenu.getMenuType();
            }
        };
        queryWrapper.eq(getMenuType, 1);
daoInterface.selectCount(queryWrapper);
org.mybatis.spring.MyBatisSystemException
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:97)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)
    at jdk.proxy2/jdk.proxy2.$Proxy103.selectOne(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:160)
    at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:87)
    at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152)
    at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)
    at jdk.proxy2/jdk.proxy2.$Proxy123.selectCount(Unknown Source)

这边有个getMenuType、getMenuType1、getMenuType2三个方法引用,getMenuType1传入到queryWrapper中查询没问题,getMenuType和getMenuType2报错

阅读 895
avatarAI BotBETA

在Java中,特别是使用MyBatis Plus时,方法引用和Lambda表达式通常用于构建查询条件,但这里的问题在于queryWrapper.eq()方法的使用方式。

首先,确认queryWrapper.eq()方法的参数类型和要求。通常,eq()方法接受两个参数:第一个参数是属性名或属性对应的函数式接口(如SFunction),第二个参数是该属性的值。然而,当你直接使用SFunction的实例作为第一个参数时,queryWrapper可能无法正确解析这个SFunction实例以识别对应的数据库列名。

在你的代码中:

SFunction<SysMenu, Integer> getMenuType1 = SysMenu::getMenuType; // 正确使用方法引用
SFunction<SysMenu, Integer> getMenuType = new SFunction<>() { // 直接实例化SFunction
    @Serial
    private static final long serialVersionUID = 4693707598369533353L;

    @Override
    public Integer apply(SysMenu sysMenu) {
        return sysMenu.getMenuType();
    }
};

queryWrapper.eq(getMenuType, 1); // 这里可能出错,因为queryWrapper可能无法从SFunction实例中解析列名

解决方案

  1. 使用方法引用:这是最直接且通常被推荐的方式,因为MyBatis Plus能够很好地解析方法引用并映射到数据库列名。

    queryWrapper.eq(SysMenu::getMenuType, 1);
  2. 如果你确实需要使用SFunction实例(尽管这通常不是必需的),你需要确保queryWrapper能够正确处理这种情况。然而,在MyBatis Plus的标准实现中,这可能不被直接支持。一种可能的解决方案是检查是否有MyBatis Plus的扩展或配置可以允许这种用法,或者考虑使用其他方式来构建查询条件。
  3. 检查MyBatis Plus的文档和社区:查看是否有其他用户遇到并解决了类似的问题,或者查看是否有关于此功能的更新或建议。
  4. 回退到使用字符串列名:如果上述方法都不可行,你可以考虑直接使用字符串列名作为eq()方法的第一个参数。

    queryWrapper.eq("menu_type", 1); // 假设menu_type是数据库中的列名

总之,推荐使用方法引用来构建查询条件,因为它既简洁又易于维护,同时也能被MyBatis Plus正确解析。如果你必须使用SFunction实例,请确保你的使用方式符合MyBatis Plus的设计和限制。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题