当前位置: 首页 > 知识库问答 >
问题:

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

邹时铭
2024-09-21
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报错

共有1个答案

寿和通
2024-09-21

在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的设计和限制。

 类似资料:
  • 问题内容: 我有一个关于反射的问题,我正在尝试使用某种eval()方法。所以我可以打电话给: 现在,我了解到java中没有eval方法,但存在反射。我做了以下代码: 这非常有效(当然,此代码周围有一个try,catch块)。它运行测试方法。但是,我想调用多个都有不同参数的方法。 我不知道这些是什么参数(不仅是String.class)。但这怎么可能呢?如何获得方法的参数类型?我知道以下方法: 但这

  • 我正在使用java高级rest客户端在我的应用程序中集成elasticsearch,但无法创建索引 在某个地方,我发现要执行请求,我们需要使用index(请求)方法(我在代码中已注释),但它表明index(请求)方法已从RestHighLevelClient类型中弃用。 这是我的代码:

  • 主要内容:1.方法引用,2.方法引用与lambda,3.方法引用的使用1.方法引用 方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。计算时,方法引用会创建函数式接口的一个实例。 方法引用通过方法的名字来指向一个方法。 方法引用可以使语言的构造更紧凑简洁,减少冗余代码。 方法引用使用一对冒号 :: 2.方法引用与lambda 3.方法引用的使用 静态方法引用 静态方法

  • 问题内容: 我在为自己创建的类编写方法时遇到了麻烦。此类旨在在TreeSet中使用,因此,它实现Comparable。该类具有以下变量: 这是该方法的实现。我希望按其成本来组织这些Node结构,因此,返回简单减法的结果。 我还实现了一种方法。 说了这么多,我有几个问题: 由于实施了新方法,因此应该实施新方法吗? 如何使用这些变量实施新的hashCode ?(请注意,Matrix类型的变量矩阵已实现

  • 我正在使用java创建一个zip文件,但我无法得到任何代码工作。我尝试了很多特定于Java7和Java8的方法,但所有的方法都显示出某种错误,是我的代码中有错误还是需要改进? 在这一行出现错误 请指导我:) 运行时出错:

  • 问题内容: 我正在为学校进度设计基于文本的冒险游戏。我将每个“级别”设置为一个类,并将每个可探索区域(节点)设置为相应类中的一个方法。 困扰我的是从一个节点移动到另一个节点的代码。由于每个节点最多连接四个其他节点,因此我必须在每种方法中重复一个极为相似的代码块。 我更愿意做的是在每个节点的开头包含一个方法数组,如下所示: 然后将该数组发送到通用方法,然后将播放器发送到正确的节点: 我简化了代码,但