Spring Data JPA - ข้อยกเว้น“ ไม่พบคุณสมบัติสำหรับประเภท”


128

ฉันค้นหาใน Google และพบผลลัพธ์มากมาย แต่ไม่มีผลลัพธ์ใดที่สามารถตอบปัญหาของฉันได้ นี่มันไปแล้ว

ฉันกำลังพยายามศึกษา Spring MVC และ Spring Data JPA โดยใช้การโคลน pinterest เพียงเล็กน้อย ดังนั้นต่อไปนี้เป็นส่วนของโค้ดที่ฉันคิดว่าเกี่ยวข้องกับปัญหาของฉัน

รุ่น / หน่วยงาน

@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"ไม่พบทรัพย์สิน" 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 เป็นผู้ให้บริการความคงอยู่ นอกจากนี้ส่วนรหัสที่ฉันใส่ไว้ที่นี่คือสิ่งที่ฉันคิดว่าเกี่ยวข้องกับปัญหา หากไม่เป็นเช่นนั้นโปรดแจ้งให้เราทราบแล้วฉันจะอัปเดตคำถามพร้อมส่วนที่จำเป็น


2
ฉันวิ่งเข้าไปในปัญหาเดียวกันเมื่อฉันได้รับการตั้งชื่อ ID ที่ฝังเป็นMyCompositePKและพยายามเขียนfindByMyCompositePKUserId (Long หมายเลขผู้ใช้) ประเด็นคือต้องเป็นกรณีอูฐเช่นกันสำหรับที่เก็บ CRUD เพื่อแยกความแตกต่างระหว่างคุณสมบัติของตารางเมื่อสร้างแบบสอบถามจากวิธีการของคุณ ดังนั้นจึงต้องเป็นMyCompositePkและfindByMyCompositePkUserId (Long userId)
EmeraldTablet

คำตอบ:


140

ฉันพบปัญหาเดียวกันนี้และพบวิธีแก้ไขที่นี่: https://dzone.com/articles/persistence-layer-spring-data

ฉันได้เปลี่ยนชื่อคุณสมบัติของเอนทิตี แต่ด้วยการสืบค้นแบบกำหนดเองโดยอัตโนมัติของสปริงส์มีการกำหนดอินเทอร์เฟซสำหรับชื่อคุณสมบัติเก่า

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

ข้อผิดพลาดระบุว่าไม่พบ "OldPropName" อีกต่อไปและส่งข้อยกเว้น

หากต้องการอ้างอิงบทความเกี่ยวกับ DZone:

เมื่อ Spring Data สร้างการใช้งาน Repository ใหม่จะวิเคราะห์วิธีการทั้งหมดที่กำหนดโดยอินเทอร์เฟซและพยายามสร้างคิวรีโดยอัตโนมัติจากชื่อเมธอด แม้ว่าสิ่งนี้จะมีข้อ จำกัด แต่ก็เป็นวิธีที่มีประสิทธิภาพและสง่างามในการกำหนดวิธีการเข้าถึงแบบกำหนดเองใหม่โดยใช้ความพยายามเพียงเล็กน้อย ตัวอย่างเช่นหากเอนทิตีที่มีการจัดการมีฟิลด์ชื่อ (และ Java Bean standard getter และ setter สำหรับฟิลด์นั้น) การกำหนดเมธอด findByName ในอินเทอร์เฟซ DAO จะสร้างคิวรีที่ถูกต้องโดยอัตโนมัติ:

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

87

การตั้งชื่อของคุณไม่ถูกต้องการตั้งชื่อของคุณไม่ถูกต้อง

ตามเอกสารประกอบหากที่เก็บของคุณคือUserBoardRepositoryการใช้งานที่เก็บแบบกำหนดเองของคุณควรเป็นชื่อในUserBoardRepositoryImplที่นี้คุณตั้งชื่อเป็นBoardServiceImplนั่นคือสาเหตุที่ทำให้เกิดข้อยกเว้น


1
นอกจากนี้คลาส / อินเทอร์เฟซที่เก็บทั้งหมดควรถูกวางไว้ในไดเร็กทอรีเดียว - เท่าที่ฉันรู้
Błażej Kocik

6
ฉันไม่รู้ว่าทำไมถึงได้รับการโหวตมากขนาดนี้ แต่ไม่มีพื้นที่เก็บข้อมูลแบบกำหนดเองที่เกี่ยวข้องกับคำถามนี้ BoardServiceImplเป็นเพียงบริการโดยใช้ไฟล์UserBoardRepository.
Didier L

นั่นคือกรณีของฉัน! ฉันไม่มีปัญหาก่อนที่ฉันจะย้ายคลาส Impl ในแพ็คเกจที่แตกต่างไปจากเดิมอย่างสิ้นเชิง แต่หลังจากนั้นก็เกิดขึ้น ขอบคุณ
Buckstabue

วันนี้ช่วยฉันไว้!
Letimome

48

คงที่ในขณะที่ใช้CrudRepositorySpring เราต้องต่อท้ายชื่อคุณสมบัติให้ถูกต้องหลังจาก 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;

1
วิธีนี้ช่วยฉัน - ฉันใช้ชื่อที่ไม่ถูกต้องของคุณสมบัติของคลาสของฉันในเมธอด 'default' ของที่เก็บ (จัดทำโดยอินเทอร์เฟซ CrudRepository) (ieinstea ของ findByDateOfStatisticsBetween () ฉันใช้ findByDateBetween () วิธีการตั้งชื่อ)
ryzhman

1
ตัวอย่างfindStatusIdผิดfindByStatusIdถูกต้องและตรวจสอบการตั้งชื่อหลายชื่อstackoverflow.com/a/32796493/944593
shareef

ประหยัดเวลาสำหรับฉันได้มาก ขอบคุณ :).
Joey587

27

เนื่องจากชื่อที่เก็บ JPA ของคุณคือUserBoardRepositoryชื่อ Interface ที่กำหนดเองของคุณควรเป็นUserBoardRepositoryCustom (ควรลงท้ายด้วย 'Custom') และชื่อคลาสการนำไปใช้ของคุณควรเป็นUserBoardRepositoryImpl (ควรลงท้ายด้วย Impl คุณสามารถตั้งค่าด้วย postfix อื่นโดยใช้ที่เก็บ -คุณสมบัติim-postfix )


17

ข้อผิดพลาดนี้เกิดขึ้นหากคุณพยายามเข้าถึงคุณสมบัติที่ไม่มีอยู่

ฉันเดาว่าการเรียงลำดับจะกระทำโดยฤดูใบไม้ผลิโดยและไม่ได้โดยproperty name real column nameและข้อผิดพลาดระบุว่า"UserBoard"ไม่มีคุณสมบัติที่ชื่อ"boardId"มีคุณสมบัติไม่มีชื่อ

bests,

โอ๊ก


ขอบคุณ. ฉันใช้เวลาสักพักในการหาวิธีแก้ปัญหานี้เพราะ Spring บ่นเกี่ยวกับบางสิ่งที่แตกต่างไปจากเดิม ฉันมีระดับAและชั้นเรียนBที่ขยายและมีสถานที่ให้บริการA xบ่นว่าไม่สามารถหาทรัพย์สินxในชั้นเรียนได้A...
GuiRitter

9

ในกรณีของฉันฉันพิมพ์ผิด (กรณีอูฐ) ในชื่อวิธีการของฉัน ฉันตั้งชื่อเป็น "findbyLastName" และต้องเผชิญกับข้อยกเว้นนี้ หลังจากที่ฉันเปลี่ยนเป็น "findByLastName" ข้อยกเว้นก็หายไป


1
หมายเหตุสำหรับตัวเอง: ตรวจสอบอีกครั้ง! :-)
lilalinux

8

หมายเหตุที่นี่: คำตอบจาก Zane XY และ Alan B.De ค่อนข้างดี สำหรับผู้ที่จะใช้ 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"


1

โปรดตรวจสอบชื่อคุณสมบัติในการเรียกค่าเริ่มต้นของ repo ei repository.findByUsername (ชื่อผู้ใช้)


0

ใน JPA ความสัมพันธ์มีเจ้าของคนเดียวและเมื่อใช้mappedByในUserBoardชั้นเรียนของคุณคุณบอกได้ว่าPinItemเป็นเจ้าของความสัมพันธ์แบบสองทิศทางนั้นและคุณสมบัติในPinItemความสัมพันธ์นั้นถูกตั้งชื่อboardความสัมพันธ์ของการตั้งชื่อ

ในUserBoardคลาสของคุณคุณไม่มีฟิลด์ / คุณสมบัติที่มีชื่อboardแต่มีคุณสมบัติpinItemListดังนั้นคุณอาจลองใช้คุณสมบัตินั้นแทน


0

หากโปรเจ็กต์ของคุณใช้ Spring-Boot คุณสามารถลองเพิ่มคำอธิบายประกอบนี้ได้ที่ Application.java ของคุณ

@EnableJpaRepositories(repositoryFactoryBeanClass=CustomRepositoryFactoryBean.class)
@SpringBootApplication

public class Application {.....

0

คุณควรได้รับหน้าการใช้งาน this เช่นนี้

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

0

คุณควรกำหนดคุณสมบัตินั้นไว้ในโมเดลหรือคลาสเอนทิตีของคุณ


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

แม้แต่ชื่อเอนทิตี Objects?
P Satish Patro

0

เมื่อเร็ว ๆ นี้ฉันมีข้อยกเว้นนี้เมื่อย้ายไปใช้สปริงบูตรุ่นใหม่กว่า (จาก 1.5.4 เป็น 1.5.20) ปัญหาอยู่ในโครงสร้างแพ็กเกจที่เก็บ

ปัญหา: ภายใต้แพ็คเกจเดียวกันคือแพ็กเกจ: repository, repositoryCustom และ repositoryImpl

วิธีแก้ไข: จัดเรียงแพ็กเกจที่เก็บใหม่เพื่อให้แพ็กเกจที่เก็บมี repositoryCustom package และ repositoryCustom package มี repositoryImpl:

กรุ 
   |
   ----- repositoryCustom
             |
             ----- repositoryImpl

0

สถานการณ์อื่นที่ยังไม่ได้กล่าวถึงในที่นี้ซึ่งทำให้เกิดข้อผิดพลาดนี้คือ API ที่รับPageable(หรือSort) และส่งต่อไปยังที่เก็บ JPA เมื่อเรียก API จาก Swagger

ค่าเริ่มต้นของ Swagger สำหรับPageableพารามิเตอร์คือ:

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

สังเกตสิ่งที่"string"มีซึ่งเป็นคุณสมบัติที่มีอยู่ การเรียกใช้ API โดยไม่ลบหรือเปลี่ยนแปลงจะทำให้เกิดorg.springframework.data.mapping.PropertyReferenceException: No property string found for type ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.