Spring Data JPA-“找不到类型的属性”异常


126

好吧,我搜索了Google并发现了很多结果,但是没有一个能够回答我的问题。所以,就到这里。

我正在尝试通过最少地实现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> {

}

现在,当我在中调用该findLatestBoards方法时BoardService,“ No Property Found”异常将被抛出return boardRepository.findAll(request).getContent();。这是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,并正确地映射到mappedBy = "board"UserBoard

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 provider。另外,我在这里放置的代码部分也是我认为与该问题相关的部分。如果不是,请告诉我,我将用必填部分更新问题。


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

Answers:


138

我遇到了同样的问题,并在这里找到了解决方案: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

86

您的命名不正确

根据文档,如果您的存储库为UserBoardRepository,则您的自定义存储库的实现应命名为UserBoardRepositoryImpl,在这里您将其命名为BoardServiceImpl,这就是它引发异常的原因。


1
此外,所有库类/接口应该放置在一个目录-据我所知
BłażejKocik

6
我不知道为什么要这么大赞,但是这个问题没有涉及自定义存储库。BoardServiceImpl只是使用的服务UserBoardRepository
Didier L

这是我的情况!在将Impl类移动到完全不同的程序包中之前,我没有遇到任何问题,但是之后发生了这种情况。谢谢
Buckstabue

这挽救了我的一天!
letimome '19

46

固定,在使用CrudRepositorySpring时,我们必须在findBy之后正确附加属性名称,否则会给您异常 “找不到类型的属性”

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

我已将以下代码用于数据库访问。

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;

1
这种方法对我有帮助-我在存储库的“默认”(由CrudRepository接口提供)方法中使用了我的类的属性名称不正确(即findByDateOfStatisticsBetween()的insinstea,我使用了findByDateBetween()方法命名)
ryzhman

1
示例findStatusId错误的findByStatusId正确和多重命名检查stackoverflow.com/a/32796493/944593
shareef

为我节省了大量时间。谢谢 :)。
Joey587 '18

27

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


17

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

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

最好的

橡木


谢谢。我花了一段时间才找到这个解决方案,因为Spring抱怨完全不同的事情。我有一个类A和一个B扩展A并具有属性的类x。它抱怨说x在课堂上找不到财产A……
GuiRitter

9

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


1
请注意:仔细检查!:-)
lilalinux

8

在这里注意: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

我想通了这一点,因为对我来说,这似乎是自然的找到其名称的类 语义,而实际上,synatxically通过myClassName找到

干杯


2

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

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



0

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

在您的UserBoard课程中,您没有名称为的任何字段/属性board,但具有属性pinItemList,因此您可以尝试使用该属性。


0

如果您的项目使用Spring-Boot,则可以尝试在Application.java上添加此批注。

@EnableJpaRepositories(repositoryFactoryBeanClass=CustomRepositoryFactoryBean.class)
@SpringBootApplication

public class Application {.....

0

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

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


0

我有一个类似的问题,使我头痛了几个小时。

我的存储库方法是:

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

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

解决的办法是,jpa / hibernate不支持复数?尽管如此,删除“ s”解决了问题:

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

抱歉,您删除了什么?这两行看起来一样
Raymond Chen

@ user7344209我更正了这个错误。请参见第二个代码示例的方法名称。
mirisbowring's

即使是实体名称对象?
P Satish Patro

0

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

问题:在同一软件包下是软件包:repository,repositoryCustom和repositoryImpl。

解决方案:重新排列存储库软件包,以便存储库软件包包含repositoryCustom软件包,而repositoryCustom软件包包含repositoryImpl:

资料库 
   |
   ----- repositoryCustom
             |
             ----- repositoryImpl

0

导致此错误的另一种情况(此处尚未提及)是一种API,当从Swagger调用该API时,该API 接收Pageable(或Sort)并将其原样传递给JPA存储库。

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.