Как исправить ошибку Spring Boot Postgres: синтаксическая ошибка в или около: ")" Позиция: 209 - PullRequest
0 голосов
/ 27 января 2020

У меня возникли проблемы при попытке восстановить соединение с Postgres сервером с помощью Spring Boot (в среде Eclipse). Объекты, относящиеся к конкретному случаю, выглядят следующим образом:

1 - Специализация - веб-приложение, в котором я работаю, обеспечивает онлайн-регистрацию на курсы атлетов колледжа, поэтому Specialization означает гимнастику или спорт, на которые любой студент может подать заявку по своему усмотрению :

@Entity
@Table(name = "Specializations")
@Getter @Setter @NoArgsConstructor 
public class Specialization {

    @Id
    @SequenceGenerator(name = "specialization_id_sequence", sequenceName = "specialization_id_sequence", allocationSize = 1, initialValue = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "specialization_id_sequence")
    @Column(name = "id")
    private Short id;

    @Column(name="name")
    private String name;

    @ManyToOne
    @JoinColumn(name="health_category_id", referencedColumnName = "id")
    private HealthCategory category;

    @Column(name="photo_file_path")
    private String photoFilePath; 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "specialization", cascade = CascadeType.ALL)
    List <Trainer> trainerList;


    @OneToMany(fetch = FetchType.LAZY, mappedBy = "specialization", cascade = CascadeType.ALL)
    List <Group> groupList;

    //some hashCode() and equals() stuff here  

    @Override
    public String toString() {
        return "Specialization [id=" + id + ", name=" + name + ", min. approvable health category=" + 
                category.getId() + ", path=" + photoFilePath + "]"; 
    }

2 - HealthCategory - обязательный класс здоровья, подлежащий официальному подтверждению для получения допуска к участию в задании по специализации (разные специализации могут быть представлены в одной и той же категории здоровья)

@Entity
@Table(name = "Health_categories")
@Getter @Setter @NoArgsConstructor 
public class HealthCategory {

@Id
@SequenceGenerator(name = "category_id_sequence", sequenceName = "category_id_sequence", allocationSize = 1, initialValue = 1)
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "category_id_sequence")
@Column(name = "id")
private Short id;

@Column(name="name")
private String name; 

@Column(name="state")
private Short state;

@OneToMany(fetch = FetchType.LAZY, mappedBy = "category", cascade = CascadeType.ALL)
private List <Specialization> specialization;   

@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Column(name="last_update")
private Date last_update;   

@OneToMany(fetch = FetchType.LAZY, mappedBy = "category", cascade = CascadeType.ALL)
private List <User> userList;   

@Override
public String toString() {
    return "Health category [id=" + id + ", name=" + name + ", state=" + state + ", last update on=" + last_update + "]"; 
}

3 - Группа - связанная со специализацией группа, в которую студент входит для прохождения курса

@Entity
@Table(name = "Groups")
@Getter @Setter @NoArgsConstructor 
public class Group {

@Id
@SequenceGenerator(name = "groupIdSequence", sequenceName = "groupIdSequence", allocationSize = 1, initialValue = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "groupIdSequence")
@Column(name = "group_id")
private Long group_id;  

// eventual values: "open", "close"   
@Column(name="registration_status")
private String registrationStatus;

// admission quota    
@Column(name="target_size")
private Integer targetSize;

// real group size evaluation at the moment  
@Column(name="actual_size")
private Integer actualSize; 


@OneToMany(fetch = FetchType.LAZY, mappedBy = "group", cascade = CascadeType.ALL)
private List <User> userList;

@ManyToOne
@JoinColumn(name="group_specialization_id", referencedColumnName = "id", nullable = false, unique = true)
private Specialization specialization;


@ManyToMany(cascade = { CascadeType.ALL })
@JoinTable(
    name="schedules",
    joinColumns = { @JoinColumn(name = "group_id") },
    inverseJoinColumns = { @JoinColumn(name="schedule_id", nullable = false) })     
private List<GroupSchedule> scheduleList;

@ManyToMany(mappedBy = "groupList")
private List<Trainer> trainerList;

@ManyToMany(cascade = { CascadeType.ALL })
@JoinTable(
    name="locations",
    joinColumns = { @JoinColumn(name = "group_id", nullable = false) },
    inverseJoinColumns = { @JoinColumn(name="location_id", nullable = false) })
private List<Location> locationList;

@Column(name="description")
private String desciption; 

4 - Тренер - инструктор, заинтересованный в проведении уроков для соответствующих групп студентов, которые проходят конкретный c курс:

@Entity
@Table(name = "Trainers")
@Getter @Setter @NoArgsConstructor 
public class Trainer {

@Id
@SequenceGenerator(name = "trainerIdSequence", sequenceName = "trainerIdSequence", allocationSize = 1, initialValue = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "trainerIdSequence")
@Column(name = "trainer_id")
private Short trainer_id;

@Column(name="first_name")
private String firstName;

@Column(name="second_name")
private String secondName;

@Column(name="last_name)")
private String lastName;

@Column(name="photo_file_path")
private String photoFilePath;   

@ManyToOne
@JoinColumn(name="specialization_id", referencedColumnName = "id", nullable = false, unique = true)
private Specialization specialization;

@ManyToMany(cascade =  {CascadeType.ALL})
@JoinTable(
    name="groups",
    joinColumns = { @JoinColumn(name = "trainer_id", nullable = false) },
    inverseJoinColumns = { @JoinColumn(name="group_id", nullable = false) })
private List<Group> groupList;  

Из-за трудностей при запуске кода с Specialization объектами, SpecializationService будет размещено здесь:

@Service
public class SpecializationService {

    @Autowired
    private SpecializationRepository specializationRepository;

    public SpecializationService(SpecializationRepository specializationRepository) {
        this.specializationRepository = specializationRepository;       
    }

    public void createSpecialization(Specialization specialization) {
        specializationRepository.save(specialization);
    }

    public List<Specialization> findALL() {
        return (List<Specialization>) specializationRepository.findAll();
    }

    public List<Specialization> getSpecializations() {
        List<Specialization> specializations = new ArrayList<>();
        specializationRepository.findAll().forEach(specializations::add);
        return specializations;     
    }
}   

SpecializationController код:

@RestController
public class SpecializationController {

    @Autowired
    SpecializationService specializationService;

    @RequestMapping("/specialization")
    public List<Specialization> getSpecializations() {
        return specializationService.getSpecializations();
    }

    @RequestMapping(method = RequestMethod.POST, value = "/specialization/create")
    public void createSpecialization(@RequestBody Specialization spec) {
        specializationService.createSpecialization(spec);
    }       
}

Кроме того, существует sql create table материал:

    CREATE SEQUENCE category_id_sequence;
    CREATE TABLE Health_Categories (
        id SMALLINT NOT NULL DEFAULT nextval('category_id_sequence') PRIMARY KEY,
        name VARCHAR(30) DEFAULT NULL,
        state SMALLINT NOT NULL,
        last_update TIMESTAMP 
    );

    -- Specialization --
    CREATE SEQUENCE specialization_id_sequence;  
    CREATE TABLE Specializations (
        id SMALLINT NOT NULL DEFAULT nextval('specialization_id_sequence') PRIMARY KEY,
        name VARCHAR(50) DEFAULT NULL,  
        health_category_id SMALLINT REFERENCES health_categories (id),
        photo_file_path VARCHAR(50) DEFAULT NULL,
        CONSTRAINT specialization_ibfk_1 FOREIGN KEY (id) REFERENCES health_categories (id)
    );

После выполнения @SpringBootApplication класс выглядит следующим образом:

@SpringBootApplication
public class DatabaseComponentsApplication {

@Autowired
private HealthCategoryService categoryService;

@Autowired
private SpecializationService specializationService;

public static void main(String[] args) {
    SpringApplication.run(DatabaseComponentsApplication.class, args);
}   

@EventListener(ApplicationReadyEvent.class)
private void testJpaMethods() {

    HealthCategory cat2 = new HealthCategory();
    Date date = new Date();
    Timestamp ts = new Timestamp(date.getTime());
    cat2.setLast_update(ts);
    cat2.setName("Test2");
    cat2.setSpecialization(null);
    cat2.setState((short) 8);
    categoryService.createCategory(cat2);

    Specialization spec = new Specialization();
    spec.setCategory(cat2);
    spec.setName("Soccer");
    spec.setPhotoFilePath(null);

    specializationService.createSpecialization(spec);
    specializationService.getSpecializations().forEach(it -> System.out.println(it));       

    }
}
* 1 032 * он жалуется из-за неправильности, которую я все еще не могу понять:
    Caused by: org.postgresql.util.PSQLException: error: syntax error at or near: ")"  Position: 209
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2505) ~[postgresql-42.2.9%20(1).jar:42.2.9]
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2241) ~[postgresql-42.2.9%20(1).jar:42.2.9]
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:310) ~[postgresql-42.2.9%20(1).jar:42.2.9]
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:447) ~[postgresql-42.2.9%20(1).jar:42.2.9]
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:368) ~[postgresql-42.2.9%20(1).jar:42.2.9]
    at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:158) ~[postgresql-42.2.9%20(1).jar:42.2.9]
    at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:108) ~[postgresql-42.2.9%20(1).jar:42.2.9]
    at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) ~[HikariCP-3.4.1.jar:na]
    at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) ~[HikariCP-3.4.1.jar:na]
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
    ... 74 common frames omitted

Не могли бы вы поделиться своими идеями, что вызывает синтаксис?

РЕДАКТИРОВАНИЕ: pom.xml код следующий

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>databaseComponents</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>databaseComponents</name>
    <description>DAO implementation draft </description>

    <properties>
        <java.version>1.8</java.version>
        <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> 
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jdk8</artifactId>
            <version>2.10.1</version>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Также application.properties материал:

spring.datasource.driver=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/core_database
spring.datasource.username=postgres
spring.datasource.password=postgres

spring.main.web-application-type=none

1 Ответ

0 голосов
/ 27 января 2020

Есть ли проблемы с вызовом метода findAll().

public List<Specialization> findAll() {
    return (List<Specialization>) specializationRepository.findAll();
}

Можете ли вы заменить getSpecializations() метод

specializationService.getSpecializations().forEach(it -> System.out.println(it));

на findALL() метод

specializationService.findALL().forEach(it -> System.out.println(it));

и посмотреть, работает ли он?

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