无法在类上找到适当的构造函数

Posted

技术标签:

【中文标题】无法在类上找到适当的构造函数【英文标题】:Could not locate appropriate constructor on class 【发布时间】:2020-04-11 20:41:20 【问题描述】:

我正在尝试将本机 SQL 结果映射到我的 POJO,但它返回错误。 这是完整的堆栈跟踪:

Hibernate: SELECT * FROM members_tb where memberName like ?
2019-12-19 07:40:20.688 TRACE 32472 --- [nio-8084-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [VARCHAR] - [%Frank%]
java.lang.IllegalArgumentException: Could not locate appropriate constructor on class : com.app.ecclesiamainframe.entity.Members
    at org.hibernate.loader.custom.ConstructorResultColumnProcessor.resolveConstructor(ConstructorResultColumnProcessor.java:92)
    at org.hibernate.loader.custom.ConstructorResultColumnProcessor.performDiscovery(ConstructorResultColumnProcessor.java:45)
    at org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:494)
    at org.hibernate.loader.Loader.processResultSet(Loader.java:2338)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:2294)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2050)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2012)
    at org.hibernate.loader.Loader.doQuery(Loader.java:953)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354)
    at org.hibernate.loader.Loader.doList(Loader.java:2815)
    at org.hibernate.loader.Loader.doList(Loader.java:2797)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2629)
    at org.hibernate.loader.Loader.list(Loader.java:2624)
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:338)
    at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:2123)
    at org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:1134)
    at org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:173)
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1526)
    at org.hibernate.query.Query.getResultList(Query.java:165)
    at com.app.ecclesiamainframe.service.impl.MembersServiceImpl.findByMembername(MembersServiceImpl.java:63)
    at com.app.ecclesiamainframe.service.impl.MembersServiceImpl$$FastClassBySpringCGLIB$$b6791a90.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:769)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)
    at com.app.ecclesiamainframe.service.impl.MembersServiceImpl$$EnhancerBySpringCGLIB$$81c0914a.findByMembername(<generated>)
    at com.app.ecclesiamainframe.controller.MembersController.getMember(MembersController.java:64)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:888)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1591)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)
2019-12-19 07:40:21.744  INFO 32472 --- [nio-8084-exec-2] i.StatisticalLoggingSessionEventListener : Session Metrics 
    1250700 nanoseconds spent acquiring 1 JDBC connections;
    0 nanoseconds spent releasing 0 JDBC connections;
    0 nanoseconds spent preparing 0 JDBC statements;
    0 nanoseconds spent executing 0 JDBC statements;
    0 nanoseconds spent executing 0 JDBC batches;
    0 nanoseconds spent performing 0 L2C puts;
    0 nanoseconds spent performing 0 L2C hits;
    0 nanoseconds spent performing 0 L2C misses;
    0 nanoseconds spent executing 0 flushes (flushing a total of 0 entities and 0 collections);
    0 nanoseconds spent executing 0 partial-flushes (flushing a total of 0 entities and 0 collections)

2019-12-19 08:39:48.231  WARN 32472 --- [l-1 housekeeper] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=45s935ms542µs800ns).
2019-12-19 08:46:56.149  WARN 32472 --- [l-1 housekeeper] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=3m17s562ms942µs).
2019-12-19 08:46:57.264  WARN 32472 --- [l-2 housekeeper] com.zaxxer.hikari.pool.HikariPool        : HikariPool-2 - Thread starvation or clock leap detected (housekeeper delta=3m17s563ms485µs800ns).

这是我的 Membermapping.xml:

<sql-result-set-mapping name="MemberMappingXml">
    <constructor-result target-class="com.app.ecclesiamainframe.entity.Members">
      <column name="memberId" />
      <column name="dcaRegno" />
      <column name="address" />
      <column name="age" />
      <column name="areaId" />
      <column name="birthday" />
      <column name="cellId" />
      <column name="dca" />
      <column name="department" />
      <column name="editor" />
      <column name="firstTime" />
      <column name="gender" />
      <column name="maritalStatus" />
      <column name="memberEmail" />
      <column name="memberHomePhoneNum" />
      <column name="memberMobileNum" />
      <column name="memberName" />
      <column name="note" />
      <column name="secondTime" />      
    </constructor-result>
</sql-result-set-mapping>

这是我的实体类:

/**
 * 
 */
package com.app.ecclesiamainframe.entity;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.ColumnResult;
import javax.persistence.ConstructorResult;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SqlResultSetMapping;
import javax.persistence.Table;

import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;

import com.vladmihalcea.hibernate.type.json.JsonStringType;

import lombok.Data;

/**
 * @author Harry
 *
 */
@Entity
@Table(name="members_tb")
@Data
@TypeDef(
    name = "json", 
    typeClass = JsonStringType.class
)
@SqlResultSetMapping(
    name = "MemberMapping",
    classes = @ConstructorResult(
        targetClass = Members.class,
        columns = 
            @ColumnResult(name = "memberId", type = Long.class),
            @ColumnResult(name = "dcaRegno", type = Long.class),
            @ColumnResult(name = "address"),
            @ColumnResult(name = "age"),
            @ColumnResult(name = "areaId", type = Long.class),
            @ColumnResult(name = "birthday"),
            @ColumnResult(name = "cellId", type = Long.class),
            @ColumnResult(name = "dca"),
            @ColumnResult(name = "department"),
            @ColumnResult(name = "editor"),
            @ColumnResult(name = "firstTime"),
            @ColumnResult(name = "gender"),
            @ColumnResult(name = "maritalStatus"),
            @ColumnResult(name = "memberEmail"),
            @ColumnResult(name = "memberHomePhoneNum", type = Long.class),
            @ColumnResult(name = "memberMobileNum", type = Long.class),
            @ColumnResult(name = "memberName"),
            @ColumnResult(name = "note"),
            @ColumnResult(name = "secondTime")

    ))
public class Members implements Serializable 

    /**
     * 
     */
    public Members() 


    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="memberId")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long memberId;

    @Column(name="dcaRegno")
    private Long dcaRegno;

    @Column(name="memberName")
    private String memberName;

    @Column(name="memberMobileNum")
    private Long memberMobileNum;

    @Column(name="memberHomePhoneNum")
    private Long memberHomePhoneNum;

    @Column(name="memberEmail")
    private String memberEmail;

    @Column(name="gender")
    private String gender;

    @Column(name="department")
    private String department;

    @Type(type = "json")
    @Column(columnDefinition = "json",name="address")
    private String address;

    @Column(name="cellId")
    private Long cellId;

    @Column(name="areaId")
    private Long areaId;

    @Column(name="maritalStatus")
    private String maritalStatus;

    @Column(name="age")
    private String age;

    @Column(name="birthday")
    private String birthday;

    @Column(name="firstTime")
    private String firstTime;

    @Column(name="secondTime")
    private String secondTime;

    @Type(type = "json")
    @Column(columnDefinition = "json",name="dca")
    private String dca;

    @Column(name="note")
    private String note;

    @Column(name="editor")
    private String editor;

    public Members(Long memberId,String memberName) 
        this.memberId = memberId;
        this.memberName = memberName;
    

    public Members(Long memberId,Long dcaRegno,String memberName,Long memberMobileNum,Long memberHomePhoneNum,String memberEmail,String gender,String department,
               String address,Long cellId,Long areaId,String maritalStatus,String age,String birthday,String firstTime,String secondTime,
               String dca,String note,String editor) 

    this.memberId = memberId;
    this.dcaRegno = dcaRegno;
    this.address = address;
    this.age = age;
    this.areaId = areaId;
    this.birthday = birthday;
    this.cellId = cellId;
    this.dca = dca;
    this.department = department;
    this.editor = editor;
    this.firstTime = firstTime;
    this.gender = gender;
    this.maritalStatus = maritalStatus;
    this.memberEmail = memberEmail;
    this.memberHomePhoneNum = memberHomePhoneNum;
    this.memberMobileNum = memberMobileNum;
    this.memberName = memberName;
    this.note = note;
    this.secondTime = secondTime;
   

这是我的会员服务实施:

@Transactional
@SuppressWarnings("unchecked")
public List<Members> findByMembername(String memberName) 

    //return membersDao.findByMemberName(memberName);
     List<Members> members = null;
    try 
         session = HibernateUtil.getSessionFactory().openSession();
         transaction = session.beginTransaction();

      // Native query selecting all columns
         Query query = session.createNativeQuery("SELECT * FROM members_tb where memberName like :memberName","MemberMapping")
                 .setParameter("memberName","%"+memberName+"%"); //named parameter binding 
                members = query.getResultList();
         transaction.commit(); 
       catch (Exception e) 
         e.printStackTrace();
       finally 
         if (session != null) 
            session.close();
         
      
     // HibernateUtil.shutdown();
      return members;
   

请问我该如何消除错误并设计一个合适的构造函数??? 可能如果我不必将每一列都加载到构造函数中,尽管我希望所有列都映射到结果中。

【问题讨论】:

【参考方案1】:

您必须为此创建一个构造函数。

在您使用过SqlResultsetMapping 的类中创建一个构造函数,并按照您在SqlResultsetMapping 中保留它们的顺序保持构造函数中的变量顺序

【讨论】:

【参考方案2】:

列出的列与构造函数参数的顺序不同。

Parameters                  Columns
=========================   ==================
Long   memberId             memberId
Long   dcaRegno             dcaRegno
String memberName           address
Long   memberMobileNum      age
Long   memberHomePhoneNum   areaId
String memberEmail          birthday
String gender               cellId
String department           dca
String address              department
Long   cellId               editor
Long   areaId               firstTime
String maritalStatus        gender
String age                  maritalStatus
String birthday             memberEmail
String firstTime            memberHomePhoneNum
String secondTime           memberMobileNum
String dca                  memberName
String note                 note
String editor               secondTime

【讨论】:

【参考方案3】:

请在 pojo 类中创建这个构造函数。我可以看到构造函数之间不匹配

Members(Long memberId,Long dcaRegno,String address,String age,Long areaId,Stringbirthday,Long cellId,String dca,String department,String editor,String firstTime,String gender,String maritalStatus,String memberEmail,Long memberHomePhoneNum, Long memberMobileNum,String memberName,String note,String secondTime)

希望这对你有用

【讨论】:

以上是关于无法在类上找到适当的构造函数的主要内容,如果未能解决你的问题,请参考以下文章

JPA,Hibernate:在现有工作 DTO 中添加新变量时“无法在类上找到适当的构造函数”

为啥在父类的构造函数中调用重载函数时,在 ES6 类上设置属性不起作用

Lombok-@Data

类的静态函数和类的构造函数有啥关系?

ES5构造函数与ES6类

如何直接从构造函数结束 C++ 代码?