gpt4 book ai didi

java - 找不到类型 Entry 的属性 findAllEntries

转载 作者:行者123 更新时间:2023-11-29 07:30:47 25 4
gpt4 key购买 nike

我不知道为什么 Spring 不喜欢我的代码:

我有Entry.java:

@Entity
@Table(name = "entries")
public class Entry {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "text")
private String text;
}

EntryDao.java:

public interface EntryDao extends JpaRepository<Entry, Long> {
List<Entry> findAllEntries();
}

EntryService.java:

@Service
public interface EntryService {

List<Entry> findAllEntries();

}

EntryServiceImpl.java:

public class EntryServiceImpl implements EntryService {
private EntryDao entryDao;
private SessionFactory sessionFactory;

@Override
@SuppressWarnings("unchecked")
public List<Entry> findAllEntries() {
Session session = this.sessionFactory.getCurrentSession();
List<Entry> entries = session.createQuery("from entries").list();
return entries;
}
}

这段代码给我一个错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entryDao': Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property findAllEntries found for type Entry!

我不明白如何处理这个错误以及为什么会出现这个错误。

最佳答案

出现异常的根本原因是您违反了在 Spring Data JPA 中声明/创建查询的约定/规则。

The official docs of Spring Data JPA提到:

The goal of Spring Data repository abstraction is to significantly reduce the amount of boilerplate code required to implement data access layers for various persistence stores.

抽象的中心接口(interface)是Repository,要管理你的实体,你需要声明你自己的Repository接口(interface),JPA会帮你创建代理实例接口(interface)。已经有一些基本的 RepositoriesCrudRepositoryPagingAndSortingRepository 来提供基本的功能,你可以从它们的名字中看出,所以通过扩展这些基本的,您将拥有许多基本方法。要定义更具体的访问方法,您需要按照 JPA 提供的方式创建查询:

  • 按照方法名称约定在您的接口(interface)中定义方法
  • 使用@Query注解手动定义

对于第一种方法,the docs of Query Create有详细的说明,这里有一些关键思想:

The mechanism strips the prefixes find…By, read…By, query…By, count…By, and get…By from the method and starts parsing the rest of it. The introducing clause can contain further expressions such as a Distinct to set a distinct flag on the query to be created. However, the first By acts as delimiter to indicate the start of the actual criteria. At a very basic level you can define conditions on entity properties and concatenate them with And and Or

简单来说,JPA 会解析方法名并尝试找到相关的属性来为您创建查询条件。

现在让我们看看你的代码,如果你只是想检索你所有的实体,你不需要定义你自己的方法,已经有预定义的findAll方法,如果你想根据 text 内容检索实体,它应该看起来像:

Entity findByText(String text)

但是您的方法 findAllEntites 不匹配任何规则,因此 JPA 向您抛出这样的错误消息。

关于java - 找不到类型 Entry 的属性 findAllEntries,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43123443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com