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

Spring数据中的自定义方法实现失败,出现“未找到属性”错误

马侯林
2023-03-14

我正在尝试使用Spring Boot 1.5.9在Spring数据存储库中实现自定义方法。释放我创建了存储库:

package com.example.springdatademo;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
interface MyEntityRepository extends JpaRepository<MyEntity, String>, CustomMyEntityRepository {

}

提供了自定义存储库:

package com.example.springdatademo;

interface CustomMyEntityRepository {
    MyEntity myCustomFindQuery();
}

以及实施:

package com.example.springdatademo;

import org.springframework.stereotype.Component;

    @Component
    class CustomMyEntityRepositoryImpl implements CustomMyEntityRepository {


        @Override
        public MyEntity myCustomFindQuery() {
            System.out.println("hello from custom query implementation");
            return null;
        }
    }

此外,我还提供了一个调用:

package com.example.springdatademo;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.Bean;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@EntityScan
@EnableJpaRepositories
@SpringBootApplication
public class SpringDataDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringDataDemoApplication.class, args);
    }

    @Bean
    public CommandLineRunner run(MyEntityRepository repository) {
        return (args) -> {
            final MyEntity myEntity1 = repository.myCustomFindQuery();
            repository.save(new MyEntity(1, "fieldTwo"));
            for (MyEntity myEntity : repository.findAll()) {
                System.out.println(myEntity);
            }
        };
    }

}

pom。xml只是由spring初始值设定项生成的普通xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
<!--        <version>2.1.9.RELEASE</version>-->
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>spring-data-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-data-demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

在Spring Boot 1.5.9上运行项目时。RELEASE我在容器创建时遇到了一个问题:起因:java.lang.IllegalArgumentExctive:未能创建查询方法公共摘要com.example.springdatademo.MyEntitycom.example.springdatademo.CustomMyEntityRepository.myCustomFindQuery()!没有找到用于类型MyEntity的属性myCustomFindQuery!

将Spring Boot版本更改为2.1.9。发布效果很好,给了我预期的结果。

我在spring-data-jpa-1.11.9中找不到任何提示。发布文档

共有2个答案

能向晨
2023-03-14

如果你想运行当前代码,那么你需要一个@NamedQuery,如果你想运行hql,或者如果你想在实体类中运行名为MyEntity.myCustomFindQuery的本机查询@NamedNativeQuery

@NamedQuery(name="MyEntity.myCustomFindQuery", 
query="SELECT 1 as a, 'a' as b from MyEntity")

  @NamedNativeQuery(name="MyEntity.myCustomFindQuery", 
    query="SELECT 1 as a, 'a' as b", resultSetMapping="mapmyCustomFindQuery")

@SqlResultSetMapping(name = "mapmyCustomFindQuery", classes = {
        @ConstructorResult(targetClass = MyEntity.class, columns = {
                @ColumnResult(name = "a"), @ColumnResult(name = "b")

        })
})

或者,您可以将这两个存储库分开(这意味着MyEntityRepository不应该扩展MyEntityRepositoryCustom)

在这种情况下,您的应用程序类将如下所示

@Autowired 
    MyEntityRepository repository;

    @Autowired
    MyEntityRepositoryCustom entityRepositoryCustom;



    public static void main(String[] args) {
        SpringApplication.run(SpringDataDemoApplication.class, args);
    }

    @Bean
    public CommandLineRunner run() {
        return (args) -> {
            final MyEntity myEntity1 = entityRepositoryCustom.myCustomFindQuery();
            repository.save(new MyEntity(1, "fieldTwo"));
            for (MyEntity myEntity : repository.findAll()) {
                System.out.println(myEntity);
            }
        };
    }
伯晨
2023-03-14

我刚刚检查了你的代码,并且能够修复它。我就是这么做的

将MyEntityRepositoryCustomImpl重命名为MyEntityRepositoryImpl

正如我在评论中告诉你的,cutom存储库应该命名为MyEntityRepositoryCustom(我想你已经这么做了)

命名约定是这里的关键。Impl类应命名为

 类似资料:
  • 当通过mysqli使用php连接数据库时,页面底部显示错误 我在此附上代码 错误来了 注意:未定义的属性:mysqli::$connection\u C:\xampp\htdocs\work\Cs\Admin Panel\dbConnect\u考试中出现错误。php第9行 请帮忙!!!!

  • 我试图只显示一个覆盖,如果我的搜索输入包含任何文本。 这是我的模板,其中我的输入字段是: : 当我在控制台中进行检查时,会更新我在输入字段中写入的任何文本。 然后,我尝试将此变量传递给另一个组件,该组件保存我的overlay div: Overlay.vue: 然而,这给我下面的错误: [Vue warn]:呈现错误:“TypeError:无法读取未定义的属性'length'” 我到底做错了什么?

  • 我在构建中添加自定义方法时遇到问题。gradle文件来检索git分支并提交哈希。这是我的密码: 问题出在哪里?我得到了以下错误: 我的gradle插件版本是3.5

  • 您需要创建一个通用的JpaRepository,以便处理系统进行的所有事务。在这里遵循这个示例。 它与实现有点不同,因为我的目标不是执行搜索,而是操作save方法。 unsatisfiedDependencyException:创建名为“sistema menuservice”的bean时出错:通过字段“sistema menurepository”表示未满足的依赖关系;嵌套异常是org.spri

  • 问题内容: 我在Windows上安装了spark,但无法运行,并显示以下错误: 火花执行的完整日志如下: 问题答案: 正如您发布的链接中所述,我遇到了完全相同的问题,并经历了许多可能的解决方案,但当时没有任何效果。通过运行spark-shell命令,它将在C:中创建tmp \ hive目录,并最终发现权限存在问题。我确保我的HADOOP_HOME设置正确并且包含\ bin \ winutils.e

  • 本文向大家介绍Laravel实现自定义错误输出内容的方法,包括了Laravel实现自定义错误输出内容的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Laravel实现自定义错误输出内容的方法。分享给大家供大家参考,具体如下: 这里分析一下laravel对于提交的数据进行验证,怎么自定义错误输出的内容 在根目录下运行命令 会在app\Http\Requests目录下创建PostUpda