java - Spring JPA 和 Hibernate 的 JPQL 查询错误

标签 java mysql hibernate spring-data-jpa jpql

我正在尝试获取与特定人员相关的所有技能。

在我的 Spring Boot 应用程序中尝试使用 JPQL 从 MySQL DB 获取数据时出现以下错误:

org.hibernate.QueryException: could not resolve property: person_skill of: com.skilltrack.app.Domain.Skill [SELECT s FROM com.skilltrack.app.Domain.Skill s JOIN s.person_skill ps WHERE ps.fk_person = ?1 ]

这是我的代码:

Person.java

@Data
@EqualsAndHashCode(exclude = "personCourses")
@Entity(name = "person")
@Table(name = "person")
public class Person implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer person_id;

    @NotBlank
    private String name;

    @NotBlank
    private String surname;

    @NotBlank
    private String email;

    @NotBlank
    private String password;

    @NotBlank
    private String personType; //admin or user

    @JsonIgnore
    @ManyToMany  // this mapping is referred to in the Course class
    @JoinTable(name = "person_course",
            joinColumns = @JoinColumn(name = "fk_person", referencedColumnName = "person_id"),
            inverseJoinColumns = @JoinColumn(name = "fk_course", referencedColumnName = "course_id"))
    private List<Course> personCourses;

    @JsonIgnore
    @ManyToMany  // this mapping is referred to in the Skill class
    @JoinTable(name = "person_skill",
            joinColumns = @JoinColumn(name = "fk_person", referencedColumnName = "person_id"),
            inverseJoinColumns = @JoinColumn(name = "fk_skill", referencedColumnName = "skill_id"))
    private List<Skill> personSkills;

类(class).java

@Data
@EqualsAndHashCode(exclude = "skills")
@Entity(name = "course")
@Table(name = "course")
public class Course {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer course_id;

    @NotBlank
    private String name;

    @NotBlank
    private String description;

    @JsonIgnore
    @ManyToMany(mappedBy = "courses") // mapping defined in Skill already
    private List<Skill> skills;

    @NotBlank
    private Boolean completed; // 0 no 1 yes

    @JsonIgnore
    @ManyToMany(mappedBy = "personCourses")
    private List<Person> coursePerson;

技能.java

@Data
@EqualsAndHashCode(exclude = "courses")
@Entity(name = "skill")
@Table(name = "skill")
public class Skill {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer skill_id;

    @NotBlank
    private String name;

    @NotBlank
    private String description;

    @JsonIgnore
    @ManyToMany(cascade = CascadeType.ALL)  // this mapping is referred to in the Course class
    @JoinTable(name = "course_skills",
            joinColumns = @JoinColumn(name = "fk_skill", referencedColumnName = "skill_id"),
            inverseJoinColumns = @JoinColumn(name = "fk_course", referencedColumnName = "course_id"))
    private List<Course> courses;

    @JsonIgnore
    @ManyToMany(mappedBy = "personSkills")
    private List<Person> skill_person;

PersonRepository.java

@Repository
public interface PersonRepository extends JpaRepository<Person, Integer> {

    @Query(value =
            "SELECT s " +
            "FROM skill s JOIN s.person_skill ps " +
            "WHERE ps.fk_person = ?1 ")
    List<Skill> getPersonSkills(Integer personID);
}


The issue is with the JPQL statement:
"SELECT s FROM skill s JOIN s.person_skill ps WHERE ps.fk_person = ?1 "

I have tried the following variations:

"SELECT s FROM skill s INNER JOIN s.person_skill ps WHERE ps.fk_person = ?1"

"SELECT s FROM skill s JOIN FETCH s.person p WHERE ps.fk_person = ?1"

"SELECT s FROM skill s JOIN s.person p JOIN s.person_skill ps WHERE ps.fk_person = ?1"

"SELECT s FROM skill s JOIN person p JOIN person_skill ps WHERE ps.fk_person = ?1"

我应该如何更改我的 JPQL 查询以返回与特定人员相关的技能列表?

最佳答案

将您错误键入的实体名称从 person_skill 更改为 skill_personSkill.java 中定义

关于java - Spring JPA 和 Hibernate 的 JPQL 查询错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56577244/

相关文章:

java - 如果在此期间满足特定条件,如何每半小时发送一次电子邮件?

java - 动态读取多个不同名称的json数组

php - 如何在php中上传CSV时包含逗号

Oracle 中的 SQL 参数限制

java - 为什么 hibernate 返回一个代理对象?

java - JPA/Hibernate - 将枚举保留为常量表

java - 使用泛型参数比使用基类参数有什么好处吗?

java - 在数字键盘上单击 "Done"后,常规键盘不断出现

c# - MySQL 连接器在枚举后面附加比实际值小一的值

php - 从 url=$url 的数据库中获取数据