Перевести из Native SQL в JPA в Spring Boot, чтобы вернуть список - PullRequest
0 голосов
/ 04 февраля 2020

Привет, мы пытаемся вернуть список заданий, содержащий список умений. Вот наш код:

@Query(nativeQuery =true, value="select * from jobs j inner join( select * from job_skills js  where skill_id IN (?1.skill_id)) on j.job_id = js.job_id")
    List<Job> findBySkills(List<Skill> skills);

Однако, когда мы тестируем с Postman и отправляем запрос POST, мы получаем ошибку:

org.hibernate.QueryException: JPA- стиль позиционного параметра не был целым порядковым числом;

Мы используем Spring Boot с PostgreSQL. Мы предполагаем, что проблема заключается здесь (?1.skill_id) Как мы можем исправить это, чтобы получить список всех навыков из таблицы заданий с запрашиваемым идентификатором?

Вот наша Модель задания с отображениями JPA

@Entity
@Table(name = "jobs")
public class Job {

    @Id
    @Column(name = "job_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    /** An integer that uniquely identifies this job. */
    private int id;

    @Column(name = "job_title")
    /** The name of this job. */
    private String title;

    @Column(name = "job_description", length=10_000)
    /** A description of this job, with a maximum length of 10,000 characters. */
    private String description;

    @Column(name = "job_location")
    /** A string identifying where the job takes place. */
    private String location;

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name = "job_skills", joinColumns = { @JoinColumn(name = "job_id") }, inverseJoinColumns = {
            @JoinColumn(name = "skill_id") })
    /** A set of skills that candidates applying to this job are expected to have. */
    private Set<Skill> skills = new HashSet<>();

    @Column(name = "job_isFilled")
    /** Returns true if the job opening is currently filled, and false otherwise. */
    private boolean isFilled;

    @OneToMany(mappedBy="job")
    private Set<Interview> interviews = new HashSet<>();

    @OneToOne
    @JoinColumn(name = "filled_by_profile_id")
    /** The employee that currently holds this job. Returns null if it is not held by any employee. */
    private Profile profile;

    /** Creates a new job with all properties set to their default values. */
    public Job() {
        super();
    }

А вот наша Модель умений (показывает только соответствующие сопоставления)

@Entity
@Table(name = "skills")
public class Skill {

    @Id
    @Column(name = "skill_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    /** An integer that uniquely identifies this skill. */
    private int id;

    @Column(name = "skill_title")
    /** The name of this skill. */
    private String title;

    @ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.MERGE }, mappedBy = "skills")
    @Column(name = "profiles")
    /** A set of candidates who claim proficiency in this skill. */

    @JsonIgnore
    private Set<Profile> profiles = new HashSet<>();

    @ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.MERGE }, mappedBy = "skills")
    @Column(name = "jobs")
    /** A set of jobs that this skill is necessary for. */
    @JsonIgnore
    private Set<Job> jobs = new HashSet<>();

    /** Creates a new skill with all properties set to their default values. */
    public Skill() {
        super();
    }

1 Ответ

0 голосов
/ 05 февраля 2020

имя свойства в сущности навыков: id , а не skill_id

выбор * из рабочих мест j внутреннее объединение (выбор * из рабочих мест js где skill_id IN (? 1. skill_id )) для j.job_id = js .job_id

@Query(nativeQuery =true, value="select * from jobs j inner join( select * from job_skills js  where skill_id IN (?1.id)) on j.job_id = js.job_id")
    List<Job> findBySkills(List<Skill> skills);
...