当前位置: 首页 > 知识库问答 >
问题:

JPA查询-类错误中没有合适的构造函数

饶骁
2023-03-14

我有一个Employee实体类,它有许多列。我想从这个类中获取一些列,因此我使用了DTO。我创建了一个新的BaseEmployee类,并在EmployeeRepository中编写了查询。但当我尝试运行应用程序时,我会遇到这样的错误:“类中没有合适的构造函数错误”。

@Entity
@Table(name = "employees")
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonAutoDetect(fieldVisibility = Visibility.ANY)
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "emp_no")
    private  int id;
    @Column(name = "birth_date")   
    private Date birthDate;
    @Column(name = "first_name")
    private String firstName;
    @Column(name = "last_name")
    private String lastName;
    @Column(name = "gender")
    private char gender;
    @Column(name = "hire_date")  
    private Date hireDate;

    @OneToMany(mappedBy = "employees")
    private List<Title> titles; 

    @OneToMany(mappedBy = "employees")
    private List<Salary> salary;

    @OneToMany(mappedBy = "employee")
    private List<DeptEmp> departmentList;

   @OneToMany(mappedBy = "employee")
   private List<DeptManager> managerDepartment;

}

我的dto类:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseEmployee {

    private  int id;
    private Date birthDate;
    private String firstName;
    private String lastName;
    private char gender;
    private Date hireDate;

}

Jpa仓库:

public interface EmployeeRepository extends JpaRepository<Employee,Integer> {
    
    List<Employee> getByFirstNameContains(String firstName);
    List<Employee> getByFirstNameStartsWith(String firstName);


    @Query("Select new dev.serhat.employeeapi.models.dtos.BaseEmployee"
    + "(e.id, e.birthDate, e.firstName, e.lastName, e.gender, e.hireDate) From Employee e WHERE e.id = :id")
    Optional<BaseEmployee> getBaseEmployeeById(int id);
    
    
}

错误:

HH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect
2022-02-20 16:33:42.533  INFO 24371 --- [  restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2022-02-20 16:33:42.559  INFO 24371 --- [  restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2022-02-20 16:33:43.431 ERROR 24371 --- [  restartedMain] o.h.hql.internal.ast.ErrorTracker        :  Unable to locate appropriate constructor on class [dev.serhat.employeeapi.models.dtos.BaseEmployee]. Expected arguments are: int, java.util.Date, java.lang.String, java.lang.String, char, java.util.Date
[cause=org.hibernate.PropertyNotFoundException: no appropriate constructor in class: dev.serhat.employeeapi.models.dtos.BaseEmployee]
2022-02-20 16:33:43.443 ERROR 24371 --- [  restartedMain] o.h.hql.internal.ast.ErrorTracker        :  Unable to locate appropriate constructor on class [dev.serhat.employeeapi.models.dtos.BaseEmployee]. Expected arguments are: int, java.util.Date, java.lang.String, java.lang.String, char, java.util.Date
[cause=org.hibernate.PropertyNotFoundException: no appropriate constructor in class: dev.serhat.employeeapi.models.dtos.BaseEmployee]

org.hibernate.hql.internal.ast.DetailedSemanticException: Unable to locate appropriate constructor on class [dev.serhat.employeeapi.models.dtos.BaseEmployee]. Expected arguments are: int, java.util.Date, java.lang.String, java.lang.String, char, java.util.Date
        at org.hibernate.hql.internal.ast.tree.ConstructorNode.resolveConstructor(ConstructorNode.java:182) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]

共有1个答案

狄灵均
2023-03-14

这个错误很简单,你的类Base雇员缺少执行getBase雇员ById()所需的适当构造函数。你的类用@NoArgsConstructor@AllArgsConstructor注释,但是这些是lombok注释,Spring可能无法识别。您的方法需要一个显式定义的构造函数,该构造函数具有以下签名:

public BaseEmployee(int id, Date birthDate, String firstName, String lastName, char gender, Date hireDate)

目前缺少这样的构造函数。

请将具有描述签名的构造函数添加到类中,然后重试。

 类似资料:
  • 问题内容: 我正在使用Jackson来将json数组反序列化为某些对象。这是我的课: 错误: 我一直在使用GSON,但由于性能问题需要放弃它。当我切换到Jackson时,我只是向所有类添加了默认构造函数,这可能是不必要的,因为没有定义其他构造函数… 编辑: 哦,JSON看起来像这样: 问题答案: 我没有与Jackson一起工作,但我想问题是Business类是成员类而不是静态的。 杰克逊需要做的是

  • 问题内容: 只有最后一部分(我的意思是我仅对此有问题) 当我编译它时,我没有合适的构造函数错误。为什么是这样??顺便说一下,Spirtokouto类的目的是要增加一个计数值(权重)。我可以将一个班级扩展到> 1个班级吗? 问题答案: Box类有两个构造函数:,但它们都不带四个参数,而您要用四个参数来调用它,因此请更改此参数: 对此: 调用必须首先在构造函数中进行。 我可以将一个班级扩展到 > 1个

  • 问题内容: 我是Java的新手,正在尝试为Minecraft制作一个mod,但我不知道如何解决此错误: 这是我的代码: 这是怎么回事,我正在尝试使字符串“ Username”重定向到另一个类。 问题答案: Java编译器告诉您不能构造对象,因为您对构造函数的调用与任何已知的构造函数都不匹配。 具体来说,编译器发现了两个构造函数: 但您致电给: 都不匹配。

  • 从javase api 8开始,是不推荐的。因此,动态生成是首选的导出对象方式,如下所示: null 我的问题是,当出现在JavaE8 api中时,为什么编译器会出错?

  • 我正在运行一个应用程序,可以在选择或捕捉它们后查看多个图像。当我运行应用程序时,ImageView部分似乎有问题,它说: