Я при создании простого приложения. Он включает в себя 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 с собственным запросом? Есть ли где-то проблемы со мной, код?