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

sping-data-jpa为您实现存储库

狄新翰
2023-03-14

我刚开始使用Springboot和Accessingdatajpa,我决定看看https://spring.io.我决定看的指南是访问数据jpa。我一直跟踪到最后,然后运行了我的应用程序。出乎意料的是,我收到了一条错误消息。

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property name found for type User!
at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:77)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:329)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:309)
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:272)
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:243)
at org.springframework.data.repository.query.parser.Part.<init>(Part.java:76)

所以问题似乎很简单。它正在我的用户类中查找属性“名称”。但我实际上并没有在任何地方使用属性“名称”。

我的存储库界面:

public interface UserRepository extends JpaRepository<User, Long> {
   List<User> findByName(String userName);
}

我的用户类:

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long userID;
    private LocalDateTime joinDate;
    private String userName;
    private String email;

    protected User(){}

    public User(String userName){
        this.userName = userName;
    }

    @Override
    public String toString() {
        return String.format("User[id=%d, userName=%s, email= %s]",userID, userName,email);
    }
}

应用类:

@SpringBootApplication
public class Application {

    private static final Logger log = LoggerFactory.getLogger(Application.class);

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

    @Bean
    public CommandLineRunner demo(UserRepository repository){
        return (args) -> {
            //Save a few Users
            repository.save(new User("Niek"));
            repository.save(new User("Costas"));
            repository.save(new User("Eric"));
            repository.save(new User("Philip"));
            repository.save(new User("Barry"));

            //Fetch all Users
            log.info("Users Found With findAll()");
            log.info("--------------------------");
            for(User user: repository.findAll()){
                log.info(user.toString());
            }
            log.info("");

            //Fetch one User
            log.info("User found With findOne(1L)");
            log.info("--------------------------");
            log.info(repository.findOne(1L).toString());

            //Fetch one User By Name
            log.info("User found with findByName(\"Niek\")");
            log.info("--------------------------");
            for(User user: repository.findByName("Niek")){
                log.info(user.toString());
            }
        };
    }
}

我假设你们中的一些人在想,你没有实现你的存储库。

在一个典型的Java应用程序中,您会期望编写一个实现自定义存储库的类。但这就是Spring Data JPA如此强大的原因:您不必编写存储库接口的实现。Spring Data JPA在您运行应用程序时动态创建一个实现。

这就引出了我的问题:

    < li >是不是因为Spring Data JPA动态提供的存储库实现,它要求一个属性“name ”,而不是只使用我提供的属性“userName ”? < li >如果对前一个问题的回答是“是”,是否可以认为提供您自己的实现将更不容易出错?因为生成的实现似乎符合某种约定。

共有2个答案

赖杰
2023-03-14
匿名用户

您忘记了注释< code>User POJO类中的所有字段。为此,您必须用< code>@Column注释对所有字段进行注释,除了第一个字段(在这种情况下,它必须用@Id进行注释)。你还必须确保,你有所有指定字段的所有getter/setter。

鲁乐
2023-03-14

答案相当简单:

  • 是的,因为Spring Data JPA创建了实现,它不识别属性“userName”并要求提供属性“name”。原因很简单,因为在接口中我声明了方法为。公共列表

 类似资料:
  • 我创建了一个maven项目,并添加了我需要的所有依赖项。我有一些使用spall-data-jpa的存储库,我添加了一些集成测试。 现在,如果我知道它是基于springmvc的,我需要添加spring data rest的ontop。但是我发现的所有例子,我需要添加spring boot来启动应用程序。我还注意到所有新的spring项目都使用spring boot。这意味着我必须学习并在我的项目中使

  • 我已经向jpa存储库添加了一个自定义方法,如http://docs.spring.io/spring-data/data-jpa/docs/1.0.x/reference/html/#repositories.custom-实施情况 就我所见,当我使用spring数据rest时,这个方法并没有公开。是否有任何方法可以将其发布为spring data REST生成的REST API的一部分(无需自己

  • 我以前从未将Spring Data JPA与存储过程一起使用过,但我非常感谢这里的任何反馈/输入

  • 我在玩spring数据存储库,有一个关于编写CRUD测试的问题。我针对Hibernate DAO和EJB3实体bean编写了许多CRUD测试,在这些测试中,我创建和实体,将其刷新到数据库中,清除实体管理器,并按ID读回它。实体管理器被清除,因此第一级缓存不会在读取时被击中。 使用spring数据存储库,我找不到一种方法来清除测试使用的底层实体管理器,这样我的读取就不会返回到实际的数据库,使我的测试

  • 我在一个spring webmvc项目上使用spring-data-jpa。我在使用我的一个实体的存储库创建查询时遇到了一个问题。下面您可以看到我的实体、我的存储库和异常。 我的实体: 我的存储库: 而例外, 最后,我将重命名为(删除下划线),并重命名getters/setters和存储库(),问题得到解决。 我的问题是为什么会发生这种情况?

  • 现在,当我启动Spring Data JPA时,我的印象是Spring Data JPA是JPA规范的独立实现。原来我错了。 如果我理解正确的话,Spring Data JPA是Spring提供的一个抽象层,它在内部使用其他JPA提供者(例如Hibernate),所以通常如下所示: