Проблема с пользовательским методом в CRUDrepository (весенняя загрузка) - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь сделать веб-приложение для маленькой автошколы, используя весеннюю загрузку. В настоящее время я пытаюсь создать таблицы, в которых используются внешние ключи: у студента будет несколько оценок, поэтому я делаю связь 1: N. Проблема в том, что, когда я пытаюсь запустить проект для тестирования, я получаю эту ошибку (только собираюсь указать причину):

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property rut found for type ResultadosPsicotecnicos!

Я сделал пользовательский метод для получения всех оценок студента, но по какой-то причине это не работает. Я заглянул в базу данных, чтобы увидеть, был ли столбец действительно создан, и вот код, который я видел:

-- Table: public.resultados_psicotecnicos

-- DROP TABLE public.resultados_psicotecnicos;

CREATE TABLE public.resultados_psicotecnicos
(
    id bigint NOT NULL,
    fecha_evaluacion character varying(255) COLLATE pg_catalog."default",
    nota1 character varying(255) COLLATE pg_catalog."default",
    nota2 character varying(255) COLLATE pg_catalog."default",
    nota3 character varying(255) COLLATE pg_catalog."default",
    nota4 character varying(255) COLLATE pg_catalog."default",
    rut bigint NOT NULL,
    CONSTRAINT resultados_psicotecnicos_pkey PRIMARY KEY (id),
    CONSTRAINT fkf57g1daekqxergtw9kck81esq FOREIGN KEY (rut)
        REFERENCES public.students (id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)

TABLESPACE pg_default;

ALTER TABLE public.resultados_psicotecnicos
    OWNER to postgres;

Я немного новичок в этой среде, поэтому, возможно, ошибка очевидна, но я не видеть это. Сейчас я покажу классы и репозитории.

Это структура проекта:

enter image description here

application.properties

spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=password
spring.jpa.show-sql=true
spring.datasource.driver-class-name=org.postgresql.Driver

## Hibernate Propierties
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQL94Dialect

# Hibernate auto ddls
spring.jpa.hibernate.ddl-auto = create

Студент. java

package net.BBB.ProjectB.entity;


import java.sql.Date;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

@Entity
@Table(name = "students")
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @NotBlank(message = "Este campo es obligatorio")
    @Column(name = "nombre")
    private String nombre;

    @NotBlank(message = "Este campo es obligatorio")
    @Column(name = "nacionalidad")
    private String nacionalidad;

    @NotNull(message = "Este campo es obligatorio")
    @Column(name = "edad")
    private long edad;

    @NotBlank(message = "Este campo es obligatorio")
    @Column(name = "rut")
    private String rut;

    @NotBlank(message = "Este campo es obligatorio")
    @Column(name = "sexo")
    private String sexo;

    @NotNull(message = "Este campo es obligatorio")
    @Column(name = "fecha_nacimiento")
    private Date fecha_nacimiento;

    @NotBlank(message = "Este campo es obligatorio")
    @Column(name = "domicilio")
    private String domicilio;

    @NotBlank(message = "Este campo es obligatorio")
    @Column(name = "email")
    private String email;

    @NotNull(message = "Este campo es obligatorio")
    @Column(name = "telefono")
    private long telefono;

    @OneToMany(mappedBy = "student", cascade = CascadeType.ALL)
    private Set<ResultadosPsicotecnicos> resultadosPsicotecnicos;

   /* constructors, getters and setters ommited */

Не путайте это rut в Студенте с тем, что в ResultadosPsicotecnicos.

ResultadosPsicotecnicos. java

package net.BBB.ProjectB.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "Resultados_Psicotecnicos")
public class ResultadosPsicotecnicos {

    @Id
    @Column(name = "id")
    private long id;

    @ManyToOne
    @JoinColumn(name = "rut", nullable = false, referencedColumnName = "id")
    private Student student;

    private String fecha_evaluacion;

    private String nota1;

    private String nota2;

    private String nota3;

    private String nota4;

    public ResultadosPsicotecnicos() {}

    public ResultadosPsicotecnicos(Student student) {
        this.student = student;
    }

    /* getters and setters ommited */

ResultadosPsicotecnicosRepository. java

package net.BBB.ProjectB.repository;

import java.util.List;

import org.springframework.data.jpa.repository.EntityGraph;
import org.springframework.data.jpa.repository.EntityGraph.EntityGraphType;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import net.BBB.ProjectB.entity.ResultadosPsicotecnicos;

@Repository
public interface ResultadosPsicotecnicosRepository extends CrudRepository<ResultadosPsicotecnicos, Long> {

    @EntityGraph(value = "Student.resultadosPsicotecnicos", type = EntityGraphType.FETCH)
    List<ResultadosPsicotecnicos> findByRut(long rut);

}

Здесь в конце приведен пользовательский метод, который вызывает ошибки. Я собираюсь использовать id студента в данный момент, позже, если я исправлю это, я буду использовать rut, но сейчас столбец внешнего ключа называется rut, и он использует id студента.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 21 марта 2020

На самом деле, JPA пытается найти колею в столбце ResultadosPsicotecnicos, так как вы указали findByRut в ResultadosPsicotecnicosRepository.

  1. Измените findByRut в ResultadosPsicotecnicosRepository, указав в качестве имени объекта, который указан ниже вашей сущности в репозитории jpa, а не в имени столбца db List findByStudent_id (long studentid);

  2. В качестве альтернативы, вы можете попробовать приведенное ниже решение. Чтобы получить список ResultadosPsicotecnicos для конкретного учащегося, необходимо добавить следующий метод в StudentRepository

@ EntityGraph (value = "Student.resultadosPsicotecnicos", type = EntityGraphType.FETCH) Студент findById (длинный идентификатор); и в верхней части вашего студенческого класса добавьте следующую строку @NamedEntityGraph (name = "Student.resultadosPsicotecnicos", attributeNodes = {@NamedAttributeNode ("resultadosPsicotecnicos")})

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...