【问题标题】:Unable to locate appropriate constructor Error无法找到适当的构造函数错误
【发布时间】:2022-08-15 21:05:48
【问题描述】:

我正在尝试为我更改的查询运行我的 gradle springboot 项目,但我无法找到我正在做的错误。谁能指出我在这方面做错了什么。

这是我创建的新课程

    @Embeddable
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PartsByPartNumber {

    String partNumber;
    
    List<Part> parts;

}

这是我写的回购类中的查询

@Repository
public interface PartRepo
        extends JpaRepository<Part, Integer>, JpaSpecificationExecutor<Part>, QueryByExampleExecutor<Part> {

......
    @Query(\"    SELECT new com.ge.digital.oa.moa.domain.PartsByPartNumber(p.partNumber, p) \"
            + \" FROM Part p \"
            + \" GROUP BY p.partNumber \")
    public List<PartsByPartNumber> findByPartsByPartNumber();
}

但是当我运行 gradle bootrun 我得到这个错误

2022-08-12 12:16:55 [restartedMain] ERROR o.h.h.i.a.ErrorTracker.reportError -  Unable to locate appropriate constructor on class [com.ge.digital.oa.moa.domain.PartsByPartNumber]. Expected arguments are: java.lang.String, com.ge.digital.oa.moa.domain.Part
[cause=org.hibernate.PropertyNotFoundException: no appropriate constructor in class: com.ge.digital.oa.moa.domain.PartsByPartNumber]
2022-08-12 12:16:55 [restartedMain] ERROR o.h.h.i.a.ErrorTracker.reportError -  Unable to locate appropriate constructor on class [com.ge.digital.oa.moa.domain.PartsByPartNumber]. Expected arguments are: java.lang.String, com.ge.digital.oa.moa.domain.Part
[cause=org.hibernate.PropertyNotFoundException: no appropriate constructor in class: com.ge.digital.oa.moa.domain.PartsByPartNumber]
org.hibernate.hql.internal.ast.DetailedSemanticException: Unable to locate appropriate constructor on class [com.ge.digital.oa.moa.domain.PartsByPartNumber]. Expected arguments are: java.lang.String, com.ge.digital.oa.moa.domain.Part
        at org.hibernate.hql.internal.ast.tree.ConstructorNode.resolveConstructor(ConstructorNode.java:182) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
        at org.hibernate.hql.internal.ast.tree.ConstructorNode.prepare(ConstructorNode.java:144) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
        at org.hibernate.hql.internal.ast.HqlSqlWalker.processConstructor(HqlSqlWalker.java:1245) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
        at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectExpr(HqlSqlBaseWalker.java:2366) [hibernate-core-5.3.9.Final.jar:5.3.9.Final]
        at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectExprList(HqlSqlBaseWalker.java:2232) [hibernate-core-5.3.9.Final.jar:5.3.9.Final]
        at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectClause(HqlSqlBaseWalker.java:1503) [hibernate-core-5.3.9.Final.jar:5.3.9.Final]
        at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:585) [hibernate-core-5.3.9.Final.jar:5.3.9.Final]
        at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:313) [hibernate-core-5.3.9.Final.jar:5.3.9.Final]
        at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:261) [hibernate-core-5.3.9.Final.jar:5.3.9.Final]
        at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:271) [hibernate-core-5.3.9.Final.jar:5.3.9.Final]
        at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:191) [hibernate-core-5.3.9.Final.jar:5.3.9.Final]
        at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:143) [hibernate-core-5.3.9.Final.jar:5.3.9.Final]
        at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:119) [hibernate-core-5.3.9.Final.jar:5.3.9.Final]
        at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80) [hibernate-core-5.3.9.Final.jar:5.3.9.Final]
        at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153) [hibernate-core-5.3.9.Final.jar:5.3.9.Final]
        at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:605) [hibernate-core-5.3.9.Final.jar:5.3.9.Final]
        at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:714) [hibernate-core-5.3.9.Final.jar:5.3.9.Final]
        at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:23) [hibernate-core-5.3.9.Final.jar:5.3.9.Final]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_251]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_251]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_251]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_251]
        at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:350) [spring-orm-5.1.6.RELEASE.jar:5.1.6.RELEASE]
        at com.sun.proxy.$Proxy175.createQuery(Unknown Source) [na:na]
        at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:87) [spring-data-jpa-2.1.6.RELEASE.jar:2.1.6.RELEASE]
        at org.springframework.data.jpa.repository.query.SimpleJpaQuery.<init>(SimpleJpaQuery.java:63) [spring-data-jpa-2.1.6.RELEASE.jar:2.1.6.RELEASE]
        at org.springframework.data.jpa.repository.query.JpaQueryFactory.fromMethodWithQueryString(JpaQueryFactory.java:76) [spring-data-jpa-2.1.6.RELEASE.jar:2.1.6.RELEASE]
        at org.springframework.data.jpa.repository.query.JpaQueryFactory.fromQueryAnnotation(JpaQueryFactory.java:56) [spring-data-jpa-2.1.6.RELEASE.jar:2.1.6.RELEASE]
        at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$DeclaredQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:142) [spring-data-jpa-2.1.6.RELEASE.jar:2.1.6.RELEASE]
        at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:209) [spring-data-jpa-2.1.6.RELEASE.jar:2.1.6.RELEASE]
        at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:79) [spring-data-jpa-2.1.6.RELEASE.jar:2.1.6.RELEASE]
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lookupQuery(RepositoryFactorySupport.java:566) [spring-data-commons-2.1.6.RELEASE.jar:2.1.6.RELEASE]
  • 为什么不使用 @AllArgsConstructor
  • 都是一样的。。也试过了
  • 我不是休眠专家,但该错误表明它正在寻找具有签名public PartsByPartNumber(String partnumber, Part part){} 的构造函数。该构造函数不存在,因为您的 POJO 中没有 Part 字段。使用该签名创建一个构造函数,我敢打赌你会看到发生了什么。
  • 那肯定是错误的,实体的类型与查询不匹配。在实体中执行Part parts;(可能不是您想要的)或调整查询,我现在不知道,因为没有@XToY 关系注释。您应该显示Part 类。
  • 是的,我想查询结果映射到的模型是 String 和 List<Part> 但我不知道为什么它在寻找 String 和 Part 的构造函数,而在模型 PartsByPartNumber 我有一个 String 和 List<Part> 的构造函数

标签: java spring spring-boot hibernate


【解决方案1】:

将注解 @NoArgsConstructor 添加到类中。

【讨论】:

  • 已添加 @NoArgsConstructor 但仍然出现相同的错误:(
  • 为什么你有那个 super() 电话?
  • 我已经删除了 super() 调用..但仍然是同样的错误
  • 实体中的 partNumber 是字符串吗?
  • 是的,它是一个字符串
【解决方案2】:

您的类PartsByPartNumber 有一个parts 类型为List&lt;Part&gt; 的字段,因此创建的构造函数将具有StringList&lt;Part&gt; 类型。在您的存储库的 HQL 查询中,您通过 new com.ge.digital.oa.moa.domain.PartsByPartNumber(p.partNumber, p) 构造函数表达式引用了一个应该是 StringPart 类型的构造函数,但它根本不存在。

您想要做的事情是 AFAIK 无法直接使用 Spring Data JPA。您需要使用 Hibernate API,例如ResultListTransformer 或获取Part 的列表,并在 Java 代码中自己构建和分组对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-12
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 2021-08-16
    • 2021-10-25
    • 2021-01-01
    相关资源
    最近更新 更多