【问题标题】:Spring Data JPA - "No Property Found for Type" ExceptionSpring Data JPA - “找不到类型的属性”异常
【发布时间】:2013-11-04 04:47:42
【问题描述】:

好吧,我搜索了谷歌并找到了很多结果,但没有一个能够回答我的问题。所以,就这样吧。

我正在尝试通过执行 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 作为 Persistence 提供程序。此外,我放在这里的代码部分是我认为与问题相关的部分。如果不是,请告诉我,我将使用所需部分更新问题。

【问题讨论】:

  • 当我将嵌入式 ID 命名为 MyCompositePK 并尝试编写 findByMyCompositePKUserId(Long userId) 时遇到了同样的问题。关键是,对于 CRUD 存储库,它也需要是驼峰式的,以便在使用您的方法创建查询时区分表属性。所以,它必须是 MyCompositePkfindByMyCompositePkUserId(Long userId)

标签: java jpa spring-data-jpa


【解决方案1】:

您可以从PagingAndSortingRepository 实施。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      我使用了getIssueTime(); 而不是getCreateTime();

      当我修复了命名的属性并解决了问题。

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题并在这里找到了解决方案: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 实现时,它会分析接口定义的所有方法并尝试自动 从方法名称生成查询。虽然这有局限性,但它 是定义新的自定义访问的一种非常强大和优雅的方式 方法很简单。例如,如果托管实体 有一个名称字段(以及 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
        

        【讨论】:

          【解决方案5】:

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

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

          正确的语法是

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

          Spring 给出错误“找不到类型列的属性”。 我正在查看存储库和实体,但没有找到任何东西。错误出现在我创建 PageRequest 对象的控制器上。

          因此,当您使用错误的语义时会引发错误,但您不必仅在存储库中犯错。

          【讨论】:

            【解决方案6】:

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

            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 方法。

            成功了!

            【讨论】:

              【解决方案7】:

              如果您使用像 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);
                }
              }
              

              【讨论】:

                【解决方案8】:

                如果您在 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);
                }
                

                【讨论】:

                  【解决方案9】:

                  除了建议之外,我还建议使用 @Repository 注释您的存储库界面。

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

                  【讨论】:

                    【解决方案10】:

                    此处尚未提及的另一种导致此错误的场景是 API 接收 Pageable(或 Sort)并在从 Swagger 调用 API 时将其按原样传递到 JPA 存储库。

                    Pageable 参数的 Swagger 默认值是这样的:

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

                    请注意"string",这是一个确实存在的属性。运行 API 而不删除或更改它会导致 org.springframework.data.mapping.PropertyReferenceException: No property string found for type ...

                    【讨论】:

                    • 这是我的问题。我的排序是在一个属性上,我全部大写以匹配数据库,但它需要小写才能匹配类上的属性,然后一切正常。谢谢!
                    【解决方案11】:

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

                    例如:您有一个名为“active”的变量名,而您的自定义 JpaRepository 方法显示“findByActiveStatus”,由于没有名为“activeStatus”的变量,它会抛出“PropertyReferenceException”

                    【讨论】:

                      【解决方案12】:

                      请检查 repo 的默认调用中的属性名称 e.i repository.findByUsername(用户名)

                      【讨论】:

                        【解决方案13】:

                        我最近在迁移到更新的 spring-boot 版本(从 1.5.4 到 1.5.20)时遇到了这个异常。问题出在存储库包结构中。

                        问题: 在同一个包下是包:repository、repositoryCustom 和 repositoryImpl。

                        解决方案: 重新排列存储库包,使存储库包包含存储库自定义包和存储库自定义包包含存储库Impl:

                        存储库 | ----- 存储库自定义 | ----- repositoryImpl

                        【讨论】:

                          【解决方案14】:

                          我遇到了一个类似的问题,让我头痛了好几个小时。

                          我的存储库方法是:

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

                          我收到错误,找不到类型 ResultClass 的属性类型。

                          解决方案是,jpa/hibernate 不支持复数?尽管如此,删除“s”解决了这个问题:

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

                          【讨论】:

                          • 抱歉,您删除了什么?这两行看起来一样
                          • @user7344209 我纠正了这个错误。查看第二个代码示例的方法名称。
                          • 即使是实体名称对象?
                          【解决方案15】:

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

                          【讨论】:

                            【解决方案16】:

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

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

                            【讨论】:

                              【解决方案17】:

                              请注意: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);
                              }
                              

                              现在您的“自定义”find by 方法必须拼写为 Collection&lt;MyClass&gt; findByMyClassName(String myClassName),因为 Spring 需要有一些机制来将此方法映射到 MyClass 属性 myClassName

                              我之所以知道这一点,是因为对我来说,按名称查找一个类 语义上似乎很自然,而事实上,语法上按 myClassName 查找

                              干杯

                              【讨论】:

                                【解决方案18】:

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

                                @EnableJpaRepositories(repositoryFactoryBeanClass=CustomRepositoryFactoryBean.class)
                                @SpringBootApplication
                                
                                public class Application {.....
                                

                                【讨论】:

                                  【解决方案19】:

                                  已修复,在使用 Spring 的 CrudRepository 时,我们必须在 findBy 之后正确附加属性名,否则会出现异常 “找不到类型的属性”

                                  我得到了这个例外。因为属性名和方法名不同步。

                                  我已将以下代码用于 DB Access。

                                  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;
                                  

                                  【讨论】:

                                  • 这种方法对我有帮助 - 我在存储库的“默认”(由 CrudRepository 接口提供)方法中使用了不正确的类属性名称(即 findByDateOfStatisticsBetween() 的 instea 我使用了 findByDateBetween() 方法命名)
                                  • 示例 findStatusId 错误 findByStatusId 正确和多个命名检查 stackoverflow.com/a/32796493/944593
                                  • 为我节省了大量时间。谢谢你:)。
                                  【解决方案20】:

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

                                  【讨论】:

                                    【解决方案21】:

                                    在我的情况下,我的方法名称中有错字(驼峰式)。我将它命名为“findbyLastName”并遇到了这个异常。在我将其更改为“findByLastName”后,异常消失了。

                                    【讨论】:

                                    • 提醒自己:仔细检查! :-)
                                    【解决方案22】:

                                    您的命名不正确

                                    根据documentation,如果你的仓库是UserBoardRepository,你的自定义仓库的实现应该命名为UserBoardRepositoryImpl,这里你命名为BoardServiceImpl,这就是它抛出异常的原因。

                                    【讨论】:

                                    • 此外,据我所知,所有存储库类/接口都应该放在一个目录中
                                    • 我不知道为什么这么多赞成,但这个问题没有涉及自定义存储库。 BoardServiceImpl 只是使用UserBoardRepository 的服务。
                                    • 这就是我的情况!在将 Impl 类移动到一个完全不同的包中之前,我没有任何问题,但在那之后就发生了。谢谢
                                    • 这拯救了我的一天!
                                    • 虽然这不是解决 OP 错误的方法,但这是您收到与 OP 标题相同的错误消息的另一个原因,这就是为什么应该考虑这个答案
                                    【解决方案23】:

                                    如果您尝试访问不存在的属性会发生此错误

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

                                    最好的,

                                    橡木

                                    【讨论】:

                                    • 谢谢。我花了一段时间才找到这个解决方案,因为 Spring 抱怨的是完全不同的东西。我有一个类A 和一个类B 扩展A 并有一个属性x。它抱怨在 A 类中找不到属性 x...
                                    • 非常感谢。这在某种程度上帮助了我。我写的是 findByUsername 而不是 findByUserName
                                    【解决方案24】:

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

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

                                    【讨论】:

                                      猜你喜欢
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2020-07-15
                                      • 2019-03-07
                                      • 1970-01-01
                                      • 2017-05-17
                                      • 2019-10-10
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多