PostgreSQL: ОШИБКА: оператор не существует: целое число = запись - Spring JPA Data - PullRequest
0 голосов
/ 09 июля 2019

Я при создании простого приложения. Он включает в себя 3 таблицы - 2 из них - многие ко многим. Это означает Категория , WordConfig и Word . Ниже я покажу вам модели этих классов.

Category.java

@Entity
@Table(name = "categories")
@NoArgsConstructor
@Data
@AllArgsConstructor
public class Category {

    public interface CategoryValidation {}

    @Id
    @Column(name = "id_category")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @NotNull
    private int id;

    @Column(name = "name")
    @NotBlank(groups = {CategoryValidation.class})
    @Length(min = 1, max = 30, groups = {CategoryValidation.class})
    @Pattern(regexp = "^[a-zA-Z0-9_'/ ]+$", groups = {CategoryValidation.class})
    private String name;

    @Column(name = "mode")
    @NotNull(groups = {CategoryValidation.class})
    @Enumerated(EnumType.STRING)
    private Mode mode;

    @Column(name = "id_parent")
    private int idParent;

    @Column(name = "defaultCategory", updatable = false)
    private boolean defaultCategory;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "id_test")
    @JsonIgnore
    @ToString.Exclude
    private Test test;

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "categories", cascade = CascadeType.ALL)
    private List<WordConfig> wordConfigs = new ArrayList<>();
}

WordConfig.java

@Entity
@Table(name = "wordConfigs")
@NoArgsConstructor
@Data
@AllArgsConstructor
public class WordConfig {
    public interface WordConfigValidation {}

    @Id
    @Column(name = "id_wordConfig")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @NotNull
    private int id;

    @Column(name = "done")
    private boolean done;

    @Column(name = "today")
    private boolean today;

    @Column(name = "repeated")
    private int repeated;

    @Column(name = "thisUnit")
    private boolean thisUnit;

    @Column(name = "dateTimeDone", updatable = false)
    private Timestamp dateTimeDone;

    @Column(name = "processNo")
    private int processNo;

    @Column(name = "lastPerfectNum")
    private int lastPerfectNum;

    @Column(name = "lastPerfect")
    private boolean lastPerfect;

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

    @Column(name = "mechanism")
    @NotNull(groups = {WordConfigValidation.class})
    @Enumerated(EnumType.STRING)
    private Mechanism mechanism;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(
            name = "CategoryWordConfig",
            joinColumns = { @JoinColumn(name = "id_wordConfig") },
            inverseJoinColumns = { @JoinColumn(name = "id_category") }
    )
    List<Category> categories = new ArrayList<>();

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "wordConfig",cascade = CascadeType.ALL)
    @Fetch(value = FetchMode.SUBSELECT)
    private List<Word> words;

}

Word.java

@Entity
@Table(name = "words")
@NoArgsConstructor
@Data
@AllArgsConstructor
public class Word {

    public interface WordValidation {}

    @Id
    @Column(name = "id_word")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @NotNull
    private int id;

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

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

    @Column(name = "seat")
    private int seat;

    @Column(name = "toSpeech")
    private boolean toSpeech;

    @Column(name = "answer")
    private boolean answer;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "id_wordConfig")
    @JsonIgnore
    @ToString.Exclude
    private WordConfig wordConfig;
}

Чтобы описать мою проблему, я должен показать вам хранилище WordConfig: WordConfigRepository.java

@Repository
public interface WordConfigRepository extends CrudRepository<WordConfig, Long> {

    List<WordConfig> findWordConfigsByCategories(List<Category> categories);
}

И последний - сервис, в котором я использую представленный метод репозитория: (немного упрощенно)

public void testWithCategoryAndWords(Test test) {
    List<Category> categories = new ArrayList<>();

    //1. categories.add(test.getCategories().get(1));
    //2. categories.add(test.getCategories().get(2));

    wordConfigRepository.findWordConfigsByCategories(categories);
}

Как это работает и в чем проблема? Я получаю категорию из теста, добавляю ее в созданный список и использую метод репозитория для получения списка wordConfig. Когда я раскомментирую только одну из закомментированных строк, все работает правильно. Проблема возникает, когда я раскомментирую обе представленные строки. Это ошибка:

org.postgresql.util.PSQLException: ERROR: operator does not exist: integer = record
  No operator matches the given name and argument types. You might need to add explicit type casts.
  Pozycja: 693
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440) ~[postgresql-42.2.5.jar:42.2.5]
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183) ~[postgresql-42.2.5.jar:42.2.5]
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308) ~[postgresql-42.2.5.jar:42.2.5]
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441) ~[postgresql-42.2.5.jar:42.2.5]
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:365) ~[postgresql-42.2.5.jar:42.2.5]
    at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:143) ~[postgresql-42.2.5.jar:42.2.5]
...

Компилятор показывает, что есть некоторая проблема с приведением типов, но почему он работает с одним элементом в списке категорий массива, а не с двумя или более? Должен ли я попробовать создать собственный @Query с собственным запросом? Есть ли где-то проблемы со мной, код?

...