0

我在存储库中获得的错误:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate appropriate constructor on class [com.foxminded.university.dto.LessonDTO]. Expected arguments are: int, java.lang.String, int, java.util.Date, java.lang.String, java.lang.String [ SELECT NEW LessonDTO (L.lessonId, L.lessonName, L.classNumber, L.date, T.teacherName, G.groupName) FROM com.foxminded.university.model.Lesson L LEFT JOIN com.foxminded.university.model.Teacher T ON L.teacherId = T.teacherId LEFT JOIN com.foxminded.university.model.Group G ON L.groupId=G.groupId  ORDER BY L.lessonId]

我有错误的查询:

@Query(" SELECT NEW LessonDTO (L.lessonId, L.lessonName, L.classNumber, L.date, T.teacherName, " +
    "G.groupName) FROM Lesson L LEFT JOIN Teacher T ON L.teacherId = T.teacherId LEFT JOIN Group G ON " +
    "L.groupId=G.groupId  ORDER BY L.lessonId")
List<LessonDTO> getAllLessonDtos();

课堂课程DTO:

@ToString
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class LessonDTO {
@Id
private int id;
private String name;
private intclassNumber;
private Date date;
private String teacherName;
private String groupName;
}

课程.class:

@Entity
@ToString
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Lesson {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer lessonId;
private String lessonName;
private Integer classNumber;
private Timestamp date;
private Integer teacherId;
private Integer groupId;
public Lesson(String lessonName, Integer classNumber, Timestamp date, Integer teacherId, Integer groupId) {
this.lessonName = lessonName;
this.classNumber = classNumber;
this.date = date;
this.teacherId = teacherId;
this.groupId = groupId;
}
}

组类:

@Entity
@ToString
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "groups", schema = "public")
public class Group {
@Id
@Column(name="group_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)|
private Integer groupId;
@Column(name="group_name")
private String groupName;
}

老师.class:

@Entity
@ToString
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "teachers", schema = "public")
public class Teacher {
@Id
@Column(name="teacher_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer teacherId;
@Column(name = "teacher_name")
private String teacherName;
@Column(name = "position")
private String position;
public Teacher(String teacherName, String position) {
this.teacherName = teacherName;
this.position = position;
}
}

此应用程序中用于 StudentDTO 的类似方法效果很好:

@Query("SELECT NEW StudentDTO (S.studentId, S.studentName, S.studentSurname, S.studentAge, S.entryYear," +
    "S.graduateYear, S.facultyName, G.groupName) FROM Student S LEFT JOIN Group G ON S.groupId=G.groupId ORDER BY S.studentId")

列出 getAllStudentDtos();

如果您需要更多信息来提供帮助,请写信。提前致谢!

4

1 回答 1

0

java.util.Date解决方法(使用而不是添加构造函数java.sql.Timestamp)是不可移植的,并且(最重要的)一点也不直观。

此外,如果它的实体 DTO 则无法分配与 DB fieldType 不匹配的任何字段.. 必须编写单独的 pojo - 不值得

如果您在查询中有 (SQL) 时间戳,您希望它可以分配给java.sql.Timestamp. Timestamp 的精度可以达到纳秒,而 Date 则不是这样。使用如下构造函数并转换对象:

public sampleDto(String name, Object lastUpdated) {
  this.name = name;
  this.lastUpdated = (Timestamp) lastUpdated;
}
于 2020-12-21T20:35:35.297 回答