Spring Data JPA - "No Property Found for Type" 异常

177

我在谷歌上搜索了很多内容,但没有一个能够解答我的问题。所以,接下来就是我的问题。

我正在尝试通过实现 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 方法时,出现"No Property Found"异常,该异常发生在return boardRepository.findAll(request).getContent();代码行。以下是来自Tomcat日志的摘录。

DEBUG日志

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"。但是,如果我理解正确,在PinItem中存在属性board,并且在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作为持久化提供程序。另外,我在这里放置的代码部分是我认为与问题相关的。如果不是,请告诉我,我将使用所需的部分更新问题。


3
我遇到了同样的问题,当我将嵌入式ID命名为MyCompositePK并尝试编写findByMyCompositePKUserId(Long userId)时。关键是CRUD存储库也需要使用驼峰命名法,以便在从方法创建查询时区分表属性。因此,它必须是MyCompositePk和*findByMyCompositePkUserId(Long userId)*。 - EmeraldTablet
在我的情况下,错误在于我写了两次“by”。 findByApropAndByBprop - 错误。只需写一次“by” -findByApropAndBprop - 正确 - lingar
30个回答

182
我遇到了同样的问题,并在此找到了解决方案:https://dzone.com/articles/persistence-layer-spring-data。因为Spring自动创建查询,所以旧属性名有一个定义的接口。
public interface IFooDAO extends JpaRepository< Foo, Long >{
     Foo findByOldPropName( final String name );
}

出现错误的原因是无法再找到OldPropName,从而抛出了异常。

引用DZone文章的话:

当Spring Data创建新的Repository实现时,它会分析接口定义的所有方法,并尝试从方法名称自动生成查询。虽然它有限制,但这是一种非常强大和优雅的定义新自定义访问方法的方式,几乎不需要任何努力。例如,如果受管理的实体具有名字字段(以及该字段的Java Bean标准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

1
你是怎么解决的呢?我似乎也做了同样的事情,但我想刷新那些自动定制查询。我该怎么做?或者我需要编辑哪个文件? - peterpie
1
解决方案是将旧的重命名为新的。您还可以定义一个@Query注释来输入要使用的查询。 - Alan B. Dee

112

你的命名不正确

根据文档,如果你的仓库是 UserBoardRepository,那么自定义仓库的实现应该命名为 UserBoardRepositoryImpl,但这里你将它命名为BoardServiceImpl,这就是为什么它会抛出异常的原因。


1
此外,所有的存储库类/接口应该放在一个目录下 - 据我所知。 - Błażej Kocik
31
我不知道为什么这个问题会被投票得这么高,因为它并没有涉及到自定义存储库。BoardServiceImpl只是一个使用UserBoardRepository的服务。 - Didier L
这就是我的情况!在我将Impl类移动到完全不同的包之前,我没有任何问题,但之后就出现了这种情况。谢谢。 - Buckstabue
1
虽然这不是解决 OP 错误的方法,但这是您可能会收到与 OP 标题相同的错误消息的另一个原因,因此应考虑采纳此答案。 - juan_carlos_yl
@BłażejKocik 不完全是这样,Impl 可以在子包中。请参见 https://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/#repositories.configuration :“ [...] 通过扫描存储库下方的类来自动检测自定义实现片段。 - potame

56

使用Spring的CrudRepository时,必须在findBy后正确添加属性名称,否则会报异常"No Property Found for Type"

我之前遇到这个异常是因为属性名称和方法名称不一致。

以下代码用于数据库访问:

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;

2
这种方法帮助了我 - 我在存储库的“默认”(由CrudRepository接口提供)方法中使用了类属性的错误名称(即,我使用了findByDateBetween()方法命名,而不是findByDateOfStatisticsBetween())。 - ryzhman
1
例如 findStatusId 错误的是 findByStatusId 正确的,对于多个命名,请参见 https://dev59.com/MVwY5IYBdhLWcg3wTGFu#32796493 - shareef
为我节省了大量时间。谢谢 :)。 - vijayakumarpsg587
在我的经验中,这是给一个方法命名为“findByAgeGreaterThanOrEqual”(“or”未被识别),而期望的形式应该是“findByAgeGreaterThanEqual”。 - nrp

38

由于你的JPA存储库名称为UserBoardRepository,因此你的自定义接口名称应该是UserBoardRepositoryCustom(它应该以“Custom”结尾),而实现类名称应该是UserBoardRepositoryImpl(应该以Impl结尾;你可以使用repository-impl-postfix属性设置不同的后缀)


我的答案是仓库里有错别字,请反复检查。 - ritu mansata

25
这个错误发生在你尝试访问不存在的属性时。
我猜测是因为排序是由Spring根据“属性名称”而不是“真实列名”进行的。 错误提示表明,在“UserBoard”中没有名为“boardId”的属性。

谢谢。我花了一些时间才找到这个解决方案,因为Spring在抱怨完全不同的事情。我有一个类A和一个继承自A并具有属性x的类B。它抱怨在类A中找不到属性x... - GuiRitter
非常感谢,那对我有所帮助。 我写成了findByUsername而不是findByUserName。 - Adil Aslam Sachwani

17

在我的情况下,我在方法名中犯了一个拼写错误(驼峰式命名)。我将其命名为“findbyLastName”,然后遇到了这个异常。当我将其更改为“findByLastName”时,异常消失了。


1
提醒自己:再仔细检查一遍! :-) - lilalinux

10

注意: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!我之所以想出这个方法,是因为在语义上,在我的看来,通过名称查找类似乎很自然,而实际上,在语法上,你是通过myClassName进行查找

干杯!


9

在我的情况下,在创建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”。

我查看了repository和Entity,但没有发现任何问题。错误出现在controller中,我在那里创建了PageRequest对象。

因此,当您使用错误的语义时,会抛出此错误,但并不一定是在Repository上犯了错误。


你的答案帮助我解决了我的问题,我的REST API中传递了空值进行排序。在传递列名后,能够获取数据。谢谢。 - Ram

7

还有一个未在此提及但会导致此错误的情况是,一个API接收Pageable(或Sort)参数,并在从Swagger调用API时将其原样传递给JPA存储库。

Swagger对于Pageable参数的默认值如下:

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

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


1
这是我的问题。我的排序是在一个属性上,我把它全部大写以匹配数据库,但它需要小写以匹配类上的属性,然后一切都正常了。谢谢! - DragonBeer

3
使用Spring Boot时,我遇到了这个错误一整天,直到意识到方法名的重要性。
感谢@avi.elkharrat提供的答案,带领我找到了解决方案的路径。
以下是我的情况以及如何解决它。
我正在开发一个API,使用户可以通过名字调用API查找客户。
在此修复中相关的类是领域类和下面我将展示的存储库。

public class Customer {

@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。

当我将方法名称更改为与Customer领域类字段private String firstname;匹配的findByfirstname()时,一切正常,该属性被找到了。

findBy视为通用方法,如果您想要自定义它,则需要将其与您要查找的字段匹配。在findBy后附上您的字段属性名称。

希望这可以帮助某些人。


谢谢你,节省了我很多时间。这些该死的名称是如此隐晦让人恼火。 - Adam Hughes
谢谢!对我来说没问题! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接