Spring Data JPA-“ No Property Found for Type”异常

我在谷歌上搜索了很多结果,但没有一个能回答我的问题。所以,开始了。

我试图通过做一个最小化的 pinterest 克隆实现来学习 Spring MVC 和 Spring Data JPA。下面是我认为与我的问题相关的代码部分。

模型/实体

@Entity
@Table(name = "pin_item")
public class PinItem implements Serializable {
// properties ...
@JoinColumn(name = "board_id", referencedColumnName = "user_board_id")
@ManyToOne(optional = false)
private UserBoard board;


// getters and setters...
}


@Entity
@Table(name = "user_board")
public class UserBoard implements Serializable {
// properties ...
@OneToMany(cascade = CascadeType.ALL, mappedBy = "board")
private List<PinItem> pinItemList;


// getters and setters...
}

服务

@Service
@Transactional(readOnly = true)
public class BoardServiceImpl implements BoardService {
@Autowired
private UserBoardRepository boardRepository;


@Override
public List<UserBoard> findLatestBoards() {
PageRequest request = new PageRequest(
0, PresentationUtil.PAGE_SIZE,
Sort.Direction.DESC, "boardId"
);
return boardRepository.findAll(request).getContent();
}


// Other Methods
}

仓库

public interface UserBoardRepository extends JpaRepository<UserBoard, Integer> {


}

现在,当我在 BoardService中调用 findLatestBoards方法时,return boardRepository.findAll(request).getContent();行上会抛出“ No Property Found”异常。下面是 Tomcat 日志的摘录。

调试日志

12:28:44,254 DEBUG AnnotationTransactionAttributeSource:106 - Adding transactional method 'findLatestBoards' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; ''
12:28:44,254 DEBUG DefaultListableBeanFactory:246 - Returning cached instance of singleton bean 'transactionManager'
12:28:44,254 DEBUG JpaTransactionManager:366 - Creating new transaction with name [com.tecnooc.picpin.service.impl.BoardServiceImpl.findLatestBoards]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; ''
12:28:44,254 DEBUG JpaTransactionManager:369 - Opened new EntityManager [org.hibernate.ejb.EntityManagerImpl@75284194] for JPA transaction
12:28:44,255 DEBUG AbstractTransactionImpl:158 - begin
12:28:44,255 DEBUG LogicalConnectionImpl:212 - Obtaining JDBC connection
12:28:44,255 DEBUG DriverManagerDataSource:162 - Creating new JDBC DriverManager Connection to [jdbc:mysql://localhost:3306/pic_pin]
12:28:44,266 DEBUG LogicalConnectionImpl:218 - Obtained JDBC connection
12:28:44,267 DEBUG JdbcTransaction:69 - initial autocommit status: true
12:28:44,267 DEBUG JdbcTransaction:71 - disabling autocommit
12:28:44,267 DEBUG JpaTransactionManager:401 - Exposing JPA transaction as JDBC transaction [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@370da60e]
12:28:44,274 DEBUG TransactionalRepositoryProxyPostProcessor$CustomAnnotationTransactionAttributeSource:286 - Adding transactional method 'findAll' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; ''
12:28:44,274 DEBUG DefaultListableBeanFactory:246 - Returning cached instance of singleton bean 'transactionManager'
12:28:44,274 DEBUG JpaTransactionManager:332 - Found thread-bound EntityManager [org.hibernate.ejb.EntityManagerImpl@75284194] for JPA transaction
12:28:44,274 DEBUG JpaTransactionManager:471 - Participating in existing transaction
12:28:44,279 DEBUG CachedIntrospectionResults:159 - Not strongly caching class [java.io.Serializable] because it is not cache-safe
12:28:44,281 DEBUG JpaTransactionManager:851 - Participating transaction failed - marking existing transaction as rollback-only
12:28:44,281 DEBUG JpaTransactionManager:559 - Setting JPA transaction on EntityManager [org.hibernate.ejb.EntityManagerImpl@75284194] rollback-only
12:28:44,283 DEBUG JpaTransactionManager:844 - Initiating transaction rollback
12:28:44,284 DEBUG JpaTransactionManager:534 - Rolling back JPA transaction on EntityManager [org.hibernate.ejb.EntityManagerImpl@75284194]
12:28:44,284 DEBUG AbstractTransactionImpl:203 - rolling back
12:28:44,284 DEBUG JdbcTransaction:164 - rolled JDBC Connection
12:28:44,285 DEBUG JdbcTransaction:126 - re-enabling autocommit
12:28:44,285 DEBUG JpaTransactionManager:594 - Closing JPA EntityManager [org.hibernate.ejb.EntityManagerImpl@75284194] after transaction
12:28:44,285 DEBUG EntityManagerFactoryUtils:338 - Closing JPA EntityManager
12:28:44,286 DEBUG LogicalConnectionImpl:232 - Releasing JDBC connection
12:28:44,286 DEBUG LogicalConnectionImpl:250 - Released JDBC connection
12:28:44,287 DEBUG ExceptionHandlerExceptionResolver:132 - Resolving exception from handler [public java.lang.String com.tecnooc.picpin.controller.BoardController.latest(javax.servlet.http.HttpSession,org.springframework.ui.Model)]: org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard
12:28:44,289 DEBUG ResponseStatusExceptionResolver:132 - Resolving exception from handler [public java.lang.String com.tecnooc.picpin.controller.BoardController.latest(javax.servlet.http.HttpSession,org.springframework.ui.Model)]: org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard
12:28:44,290 DEBUG DefaultHandlerExceptionResolver:132 - Resolving exception from handler [public java.lang.String com.tecnooc.picpin.controller.BoardController.latest(javax.servlet.http.HttpSession,org.springframework.ui.Model)]: org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard
12:28:44,291 DEBUG DispatcherServlet:959 - Could not complete request

例外

org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard”是个例外。但是,如果我理解正确的话,属性 board存在于 PinItem中,并且与 UserBoard中的 mappedBy = "board"正确映射。

org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard
at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:75)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:327)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:353)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:307)
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:271)
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:245)
at org.springframework.data.jpa.repository.query.QueryUtils.toJpaOrder(QueryUtils.java:408)
at org.springframework.data.jpa.repository.query.QueryUtils.toOrders(QueryUtils.java:372)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:456)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:437)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:319)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:289)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:333)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:318)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.data.jpa.repository.support.LockModeRepositoryPostProcessor$LockModePopulatingMethodIntercceptor.invoke(LockModeRepositoryPostProcessor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at com.sun.proxy.$Proxy147.findAll(Unknown Source)
at com.tecnooc.picpin.service.impl.BoardServiceImpl.findLatestBoards(BoardServiceImpl.java:45)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at com.sun.proxy.$Proxy148.findLatestBoards(Unknown Source)
at com.tecnooc.picpin.controller.BoardController.latest(BoardController.java:31)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)

我不明白为什么会抛出这个异常。知道为什么会发生这种情况吗?

注意: 我使用 Hibernate 作为持久性提供程序。另外,我在这里放置的代码部分是我认为与问题相关的。如果不是,让我知道,我会更新的问题与所需的部分。

483526 次浏览

在 JPA 中,一个关系只有一个所有者,通过在 UserBoard类中使用 mappedBy,可以知道 PinItem是该双向关系的所有者,并且关系的 PinItem中的属性名为 board

UserBoard类中,您没有任何名为 board的字段/属性,但是它有一个属性 pinItemList,因此您可以尝试使用该属性。

如果尝试访问 un- 存在属性,则会发生此错误

我的猜测是,排序是由 property name而不是由 real column name在春季完成的。 错误表明,在 "UserBoard"中没有名为 "boardId"的属性。

最好的,

橡树

我遇到了同样的问题,并在这里找到了解决方案: https://dzone.com/articles/persistence-layer-spring-data

我重命名了一个实体属性。但是在 Springs 自动定制查询中,有一个为旧属性名定义的接口。

public interface IFooDAO extends JpaRepository< Foo, Long >{
Foo findByOldPropName( final String name );
}

错误指示它不能再找到 OldPropName并抛出异常。

引用 DZone 上的文章:

当 Spring Data 创建一个新的 Repository 实现时,它会分析接口定义的所有方法并尝试自动执行 从方法名称生成查询 是定义新的自定义访问的一种非常强大和优雅的方法 方法。例如,如果托管实体 有一个 name 字段(JavaBean 标准的 getter 和 setter 用于 ) ,定义 DAO 接口中的 findByName 方法将 自动生成正确的查询:

public interface IFooDAO extends JpaRepository< Foo, Long >{
Foo findByName( final String name );
}

这是一个相对简单的示例; 查询创建机制支持更大的关键字集。

如果解析器无法将属性与域对象字段匹配,将引发以下异常:

java.lang.IllegalArgumentException: No property nam found for type class org.rest.model.Foo

您的命名不正确。

根据 文件,如果您的存储库是 UserBoardRepository,那么您的自定义存储库的实现应该命名为 UserBoardRepositoryImpl,在这里您将它命名为 BoardServiceImpl,这就是它抛出异常的原因。

在我的例子中,在方法名中有一个输入错误(驼峰大小写)。我将其命名为“ findbyLastName”,并面临这个异常。在我将其更改为“ findByLastName”之后,异常消失了。

因为您的 JPA 存储库名称是 UserBoardRepository,所以您的自定义 Interface 名称应该是 UserBoardRepositoryCustom(它应该以“ Custom”结束) ,并且您的实现类名称应该是 UserBoardRepositoryImpl(应该以 Impl 结束; 您可以使用 < em > itory-impl-postfix 属性用不同的后缀设置它)

在使用 Spring 的 CrudRepository时,我们必须在 findBy 之后正确地附加 property 名称,否则它会给你异常 “无类型财产”

我得到这个异常是因为。因为属性名和方法名不同步。

我已经使用下面的代码数据库访问。

public interface UserDao extends CrudRepository<User, Long> {
User findByUsername(String username);

我的域名用户有属性。

@Entity
public class User implements UserDetails {


/**
*
*/
private static final long serialVersionUID = 1L;


@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "userId", nullable = false, updatable = false)
private Long userId;
private String username;

如果您的项目使用 Spring-Boot,您可以尝试在 应用程序。

@EnableJpaRepositories(repositoryFactoryBeanClass=CustomRepositoryFactoryBean.class)
@SpringBootApplication


public class Application {.....

注意: Zane XY 和 Alan B. Dee 的答案很好。然而,对于那些现在就使用 Spring Boot 和 Spring Data 的人来说,这里有一个更现代的答案。

假设您有一个类,比如:

@Entity
class MyClass {
@Id
@GeneratedValue
private Long id;


private String myClassName;
}

这里的 JpaRepository看起来像

interface MyClassRepository extends JpaRepository {
Collection<MyClass> findByMyClassName(String myClassName);
}

现在您的“自定义”发现方法必须精确地拼写为 Collection<MyClass> findByMyClassName(String myClassName),因为 Spring 需要一些机制来映射 MyClass属性 myClassName上的这个方法!

我弄明白了这一点,因为,对我来说,这似乎是自然的 通过它的名字找到一个类 语义上的,而事实上,同步的通过我的课名查找

干杯

你应该收到使用页面,像这样

 @Override
public Page<UserBoard> findLatestBoards() {
PageRequest request = new PageRequest(
0, PresentationUtil.PAGE_SIZE,
Sort.Direction.DESC, "boardId"
);
return boardRepository.findAll(request).getContent();
}

您应该在模型或实体类中定义该属性。

我也有过类似的问题,这让我头疼了好几个小时。

我的存储库方法是:

public List<ResultClass> findAllByTypeAndObjects(String type, List<Object> objects);

我发现了一个错误,没有找到 ResultClass 类型的属性类型。

解决办法是,jpa/hibernate 不支持复数形式? 然而,删除“ s”解决了这个问题:

public List<ResultClass> findAllByTypeAndObject(String type, List<Object>

我最近在转移到更新的 Spring-boot 版本(从1.5.4到1.5.20)时遇到了这个例外。问题在于存储库包结构。

问题: 在同一个软件包下还有软件包: Repository、 RepositoryCustom 和 RepositoryImpl。

解决方案: 重新排列存储库包,使存储库包包含 RepitoryCustom 包,并使 RepitoryCustom 包包含 RepitoryImpl:

repository
|
----- repositoryCustom
|
----- repositoryImpl

请在回购的默认调用中检查属性名称 E.I FindByUsername (用户名)

看起来您的自定义 JpaRepository 方法名与实体类中的任何变量都不匹配。确保方法名与实体类中的变量匹配

例如: 您得到一个名为“ active”的变量名,并且您的自定义 JpaRepository 方法说“ findByActiveStatus”,因为没有名为“ activeStatus”的变量,所以它将抛出“ PropertyReferenceException”

另一个场景(这里还没有提到)导致了这个错误,这是一个 API,它接收 Pageable(或 Sort) ,并在从 Swagger 调用 API 时将其传递给 JPA 存储库。

Pageable参数的 Swagger 默认值如下:

  {
"page": 0,
"size": 0,
"sort": [
"string"
]
}

注意这里的 "string"是一个确实存在的属性。在不删除或更改 API 的情况下运行 API 将导致 org.springframework.data.mapping.PropertyReferenceException: No property string found for type ...

除了这些建议之外,我还建议使用 @ Repository对 Repository 接口进行注释。

SpringIOC 可能无法将其检测为存储库,因此无法检测实体及其相应属性。

如果在 bean 中使用复合键,则参数将是一个对象。您需要根据新的组合调整 findBy 方法。

@Embeddable
public class CombinationId implements Serializable {


private String xId;
private String yId;
}


public class RealObject implements Serializable, Persistable<CombinationId> {


@EmbeddedId private CombinationId id;
}

在这种情况下,存储库 findBy 方法应该如下所示

@Repository
public interface PaymentProfileRepository extends JpaRepository<RealObject, String> {


List<RealObject> findById_XId(String someString);
}

如果您正在使用类似 MessageStatus 的 ENUM,则可能需要一个转换器:

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;


/**
* Convert ENUM type in JPA.
*/
@Converter(autoApply = true)
public class MessageStatusConverter implements AttributeConverter<MessageStatus, Integer> {
@Override
public Integer convertToDatabaseColumn(MessageStatus messageStatus) {
return messageStatus.getValue();
}


@Override
public MessageStatus convertToEntityAttribute(Integer i) {
return MessageStatus.valueOf(i);
}
}

这可能会帮助像我一样有类似问题的人,我遵循所有的命名和界面标准,但我仍然面临问题。

My param name was -->  update_datetime

我想根据 update _ datetime 按降序获取我的实体,但是我得到了错误

org.springframework.data.mapping.PropertyReferenceException: No property update found for type Release!

不知为何,它没有读取“下划线”字符—— > (_)

so for workaround i changed the property name as  --> updateDatetime

然后使用相同的方法来使用 JpaRepository 方法。

成功了!

在我的例子中,我在创建 PageRequest 对象时使用了错误的列名进行排序。

PageRequest paging = PageRequest.of(page, 30, Sort.by("column_name"));

正确的语法是

PageRequest paging = PageRequest.of(page, 30, Sort.by("columnName"));

Spring 给出了一个错误“ No property found for type column”。 我查了存储库和实体,什么都没找到。错误出现在我创建 PageRequest 对象的控制器上。

因此,当您使用错误的语义时会抛出错误,但是不一定只是在 Repository 中完成了这个错误。

我使用投影,也有同样的错误。

我用的是 getIssueTime();而不是 getCreateTime();

当我固定的属性命名和问题得到解决。

这种问题是由于类中缺少构造函数造成的。 创建默认构造函数

您可以从 PagingAndSortingRepository实现。

在我的例子中,我的属性名是“ card _ set _ code”,我只是改为“ cardSetCode”并工作

使用 Spring Boot,我花了整整一天的时间才意识到方法名的重要性。

向上面回答的@avi. elkharrat 致敬,感谢他带领我走上寻找解决方案的道路。

下面是我的设想和解决方案。

我当时正在开发一个 api,它可以让用户通过 api 调用来根据名字找到客户。

在此修复程序中重要的类是我将分别在下面展示的域类和存储库。

公共类别顾客{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;


private String firstname;
private String lastname;

}

公共接口 CustomerRepository 扩展了 JpaRepository < Customer,Long > {

Customer findByFirstName(String firstname);

}

当应用程序在代码上方启动时,将引发以下错误,

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customerRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract guru.springfamework.domain.Customer guru.springfamework.repositories.CustomerRepository.findByFirstName(java.lang.String)! No property firstName found for type Customer! Did you mean 'firstname'?

我在代码库中搜索了错误消息中提到的引用字段 firstName 的驼峰大小写版本。不在那里。

然而,我意识到这个值是由 Spring Data 根据我在存储库中创建的自定义方法的名称生成的。

存储库中的 findByFirstName()正在查找 firstName。

当我将方法名改为 findByfirstname()时,与 Customer 域类字段 private String firstname;相匹配的方法都正常工作,找到了属性。

findBy视为通用方法,如果您想自定义它,它需要与您试图找到的字段匹配。然后附上字段属性的名称

希望这能帮到别人。

我经历了一个类似的问题,得到了相同的错误。

List<Users> list = userRepo.findAll(Sort.by(Direction.ASC, "userId", "memberLevel");

我得到了以下错误:

org.springframework.data.mapping.PropertyReferenceException: No property userId found for type User!

因为 userId 在一个主键对象中,如下所示:

private UserPk pk;

UserId 在 UserPk 中:

@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "userId", column = @Column(name = "USER_ID", nullable = false, length = 10)),
@AttributeOverride(name = "currency", column = @Column(name = "CAT_CODE", nullable = false, length = 4)),
@AttributeOverride(name = "memberLevel", column = @Column(name = "MEMBER_LEVEL", nullable = false, length = 4))})
public UserPk getPk() {
return pk;
}

解决方案是更改它,以便它引用主键属性名

List<Users> list = userRepo.findAll(Sort.by(Direction.ASC, "pk.userId", "pk.memberLevel");

将属性名从 comp _ id 更改为 compId 后,问题就解决了 然后将 delete 方法更改为 delete teByCompId。 成功了