Dữ liệu mùa xuân JPA - Không có tài sản nào được tìm thấy cho Loại ngoại lệ


126

Chà, tôi đã tìm kiếm Google và tìm thấy nhiều kết quả, nhưng không ai trong số họ có thể trả lời vấn đề của tôi. Vì vậy, ở đây nó đi.

Tôi đang cố gắng nghiên cứu Spring MVC và Spring Data JPA bằng cách thực hiện tối thiểu bản sao pinterest. Vì vậy, sau đây là các phần của mã mà tôi nghĩ là có liên quan đến vấn đề của tôi.

Mô hình / Thực thể

@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...
}

Dịch vụ

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

Kho

public interface UserBoardRepository extends JpaRepository<UserBoard, Integer> {

}

Bây giờ, khi tôi gọi findLatestBoardsphương thức trong BoardService, ngoại lệ "Không tìm thấy thuộc tính" được ném lên dòng return boardRepository.findAll(request).getContent();. Đây là đoạn trích từ nhật ký tomcat.

ĐĂNG NHẬP

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

ngoại lệ

Ngoại lệ là " org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard". Nhưng, nếu tôi hiểu đúng, bất động sản boardhiện diện trong PinItemvà được ánh xạ một cách chính xác với mappedBy = "board"trong 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)

Tôi không hiểu tại sao ngoại lệ này được ném. Bất cứ ý tưởng tại sao nó đang xảy ra?

Lưu ý: Tôi đang sử dụng Hibernate làm nhà cung cấp Kiên trì. Ngoài ra, phần mã tôi đặt ở đây là những gì tôi nghĩ có liên quan đến vấn đề. Nếu không, hãy cho tôi biết và tôi sẽ cập nhật câu hỏi với phần bắt buộc.


2
Tôi gặp vấn đề tương tự khi tôi đặt tên ID nhúng là MyCompổngPK và thử viết findByMyCompổngPKUserId (Long userId) . Vấn đề là, nó cũng cần phải là trường hợp lạc đà cho kho lưu trữ CRUD, để phân biệt giữa các thuộc tính bảng khi tạo truy vấn ra khỏi phương thức của bạn. Vì vậy, nó phải là MyCompổngPkfindByMyCompổngPkUserId (Long userId)
EmeraldTablet

Câu trả lời:


138

Tôi gặp vấn đề tương tự và tìm thấy giải pháp ở đây: https://dzone.com/articles/persistence-layer-spring-data

Tôi đã đổi tên một tài sản thực thể. Nhưng với Springs Automatic Custom Queries, có một giao diện được xác định cho tên thuộc tính cũ.

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

Lỗi chỉ ra rằng nó không còn có thể tìm thấy "OldPropName" và đã ném ngoại lệ.

Để trích dẫn bài viết trên DZone:

Khi Spring Data tạo ra một triển khai Kho lưu trữ mới, nó sẽ phân tích tất cả các phương thức được xác định bởi các giao diện và cố gắng tự động tạo các truy vấn từ tên phương thức. Mặc dù điều này có những hạn chế, nhưng nó là một cách rất mạnh mẽ và thanh lịch để xác định các phương thức truy cập tùy chỉnh mới với rất ít nỗ lực. Ví dụ: nếu thực thể được quản lý có trường tên (và getter và setter tiêu chuẩn Java Bean cho trường đó), việc xác định phương thức findByName trong giao diện DAO sẽ tự động tạo truy vấn chính xác:

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

Đây là một ví dụ tương đối đơn giản; một bộ từ khóa lớn hơn nhiều được hỗ trợ bởi cơ chế tạo truy vấn.

Trong trường hợp trình phân tích cú pháp không thể khớp thuộc tính với trường đối tượng miền, ngoại lệ sau được đưa ra:

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

86

Việc đặt tên của bạn không chính xác .

Theo tài liệu , nếu kho lưu trữ của bạn là UserBoardRepository, việc triển khai kho lưu trữ tùy chỉnh của bạn nên được đặt tên là UserBoardRepositoryImpl, ở đây bạn đặt tên cho nó là BoardServiceImpl, đó là lý do tại sao nó ném ngoại lệ.


1
ngoài ra, tất cả các lớp / giao diện kho lưu trữ nên được đặt trong một thư mục - theo như tôi biết
Błażej Kocik

6
Tôi không biết tại sao điều này được nâng cấp rất nhiều, nhưng không có kho lưu trữ tùy chỉnh liên quan đến câu hỏi này. BoardServiceImplchỉ là một dịch vụ sử dụng UserBoardRepository.
Didier L

đó là trường hợp của tôi Tôi không gặp vấn đề gì trước khi tôi chuyển các lớp Impl trong một gói hoàn toàn khác, nhưng sau đó điều này đã xảy ra. Cảm ơn bạn
Buckstabue

Điều này đã cứu ngày của tôi!
letimome

46

Đã sửa lỗi, trong khi sử dụng CrudRepositorySpring, chúng tôi phải nối chính xác tên thuộc tính sau findBy nếu không, nó sẽ cung cấp cho bạn ngoại lệ "Không tìm thấy thuộc tính cho loại hình

Tôi đã nhận được ngoại lệ này là. bởi vì tên thuộc tính và tên phương thức không đồng bộ.

Tôi đã sử dụng mã dưới đây cho DB Access.

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

và người dùng tên miền của tôi có tài sản.

@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
Cách tiếp cận này đã giúp tôi - tôi đã sử dụng tên không chính xác của một thuộc tính của lớp học của tôi trong của kho 'mặc định' (cung cấp bởi giao diện CrudRepository) phương pháp (ieinstea của findByDateOfStatisticsBetween () Tôi đã từng findByDateBetween () phương pháp đặt tên)
ryzhman

1
ví dụ findStatusIdsai findByStatusIdchính xác và cho nhiều lần đặt tên kiểm tra stackoverflow.com/a/32796493/944593
shareef

Tiết kiệm một tấn thời gian cho tôi. Cảm ơn bạn :).
Joey587

27

Kể từ khi tên kho JPA của bạn là UserBoardRepository , tùy chỉnh tên giao diện của bạn nên được UserBoardRepositoryCustom (nó nên kết thúc với 'Custom') và tên lớp thực hiện của bạn nên được UserBoardRepositoryImpl (nên kết thúc với Impl; bạn có thể đặt nó với một postfix khác nhau bằng cách sử dụng repository- thuộc tính hậu tố)


17

lỗi này xảy ra nếu bạn thử truy cập thuộc tính không tồn tại

Tôi đoán là việc sắp xếp được thực hiện vào mùa xuân property namevà không phải bởi real column name. và lỗi chỉ ra rằng, "UserBoard"không có thuộc tính có tên"boardId" .

tốt nhất,

Sồi


Cảm ơn bạn. Tôi phải mất một thời gian để tìm ra giải pháp này vì Spring đã phàn nàn về một thứ hoàn toàn khác. Tôi có một lớp học Avà một lớp học Bmở rộng Avà có một tài sản x. Nó đã phàn nàn rằng nó không thể tìm thấy tài sản xtrong lớp A...
GuiRitter

9

Trong trường hợp của tôi, tôi đã có một lỗi đánh máy (trường hợp lạc đà) trong tên phương thức của tôi. Tôi đặt tên nó là "findbyLastName" và phải đối mặt với ngoại lệ này. Sau khi tôi đổi nó thành ngoại lệ "findByLastName" đã biến mất.


1
Lưu ý với bản thân: Kiểm tra kỹ! :-)
lilalinux

8

Lưu ý ở đây: câu trả lời từ Zane XY và Alan B. Dee khá tốt. Tuy nhiên, đối với những người sẽ sử dụng Spring Boot bây giờ và Spring Data, đây là câu trả lời hiện đại hơn.

Giả sử bạn có một lớp như:

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

    private String myClassName;
}

Bây giờ một JpaRepositorycho điều này sẽ trông giống như

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

Bây giờ "tùy chỉnh" tìm theo phương thức của bạn phải đánh vần Collection<MyClass> findByMyClassName(String myClassName)chính xác vì Spring cần có một số cơ chế để ánh xạ phương thức này lên thuộc MyClasstính myClassName!

Tôi đã tìm ra điều này bởi vì, đối với tôi, nó có vẻ tự nhiên để tìm một lớp học theo tên của nó ngữ nghĩa , trong khi trên thực tế, synatxically bạn tìm thấy bằng myClassName

Chúc mừng


2

có vẻ như tên phương thức JpaRep repository tùy chỉnh của bạn không khớp với bất kỳ Biến nào trong các lớp thực thể của bạn. Đảm bảo tên phương thức của bạn khớp với một biến trong lớp thực thể của bạn

ví dụ: bạn có một tên biến gọi là "active" và phương thức JpaRep repository tùy chỉnh của bạn nói "findByActiveStatus" và vì không có biến nào được gọi là "activeStatus" nên nó sẽ ném "PropertyReferenceException"


1

Vui lòng kiểm tra tên thuộc tính trong cuộc gọi xác thực của repo ei repository.findByUsername (tên người dùng)


0

Trong JPA, một mối quan hệ có một chủ sở hữu duy nhất và bằng cách sử dụng mappedBytrong UserBoardlớp của bạn, bạn nói rằng đó PinItemlà chủ sở hữu của mối quan hệ hai chiều đó và rằng tài sản trong PinItemmối quan hệ được đặt tênboard .

Trong UserBoardlớp của bạn, bạn không có bất kỳ trường / thuộc tính nào có tên board, nhưng nó có một thuộc tính pinItemList, vì vậy bạn có thể thử sử dụng thuộc tính đó để thay thế.


0

Nếu dự án của bạn sử dụng Spring-Boot, bạn có thể thử thêm chú thích này tại Application.java.

@EnableJpaRepositories(repositoryFactoryBeanClass=CustomRepositoryFactoryBean.class)
@SpringBootApplication

public class Application {.....

0

bạn sẽ nhận được trang sử dụng , như thế này

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

0

Bạn nên có thuộc tính đó được định nghĩa trong mô hình hoặc lớp thực thể của bạn.


0

Tôi có một vấn đề tương tự khiến tôi đau đầu vài giờ.

Phương pháp lưu trữ của tôi là:

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

Tôi đã gặp lỗi, loại thuộc tính không được tìm thấy cho loại resultClass.

Giải pháp là, jpa / hibernate không hỗ trợ số nhiều? Tuy nhiên, loại bỏ 's' đã giải quyết vấn đề:

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

Xin lỗi những gì bạn đã loại bỏ? Hai dòng này trông giống nhau
Raymond Chen

@ user7344209 Tôi đã sửa lỗi này. Xem tên phương thức của mẫu mã thứ hai.
mirisbowring

Ngay cả đối tượng tên thực thể?
P Satish Patro

0

Gần đây tôi đã có ngoại lệ này khi chuyển sang phiên bản khởi động mới hơn (từ 1.5.4 đến 1.5.20). Vấn đề là trong cấu trúc gói kho lưu trữ.

Vấn đề: Trong cùng một gói là các gói: repository, repositoryCustom và repositoryImpl.

Giải pháp: Sắp xếp lại các gói kho lưu trữ để gói kho chứa gói repositoryCustom và gói repositoryCustom chứa repositoryImpl:

kho 
   |
   ----- kho lưu trữ
             |
             ----- kho lưu trữ

0

Một kịch bản khác, chưa được đề cập ở đây, gây ra lỗi này là API nhận Pageable(hoặcSort ) và chuyển nó, như là, đến kho lưu trữ JPA khi gọi API từ Swagger.

Giá trị mặc định của Swagger cho Pageabletham số này là:

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

Lưu ý "string"rằng đó là một tài sản tồn tại. Chạy API mà không xóa hoặc thay đổi nó sẽ gây raorg.springframework.data.mapping.PropertyReferenceException: No property string found for type ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.