Репозиторий Java JPA Один к одному. Таблица соединения. Неправильная переменная соединения и неизвестная ошибка столбца.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Репозиторий Java JPA Один к одному. Таблица соединения. Неправильная переменная соединения и неизвестная ошибка столбца.

Сообщение Anonymous »

Я изо всех сил пытаюсь заставить работать вызов репозитория JPA с отношением соединения один к одному.
У меня есть две таблицы product и display_name, поэтому я создал следующие объекты

Код: Выделить всё

 @Entity
@Table(name = "product")
@NoArgsConstructor
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true, of = "id")
@Getter
@Setter
public class Product {

@Builder
public Product(
UUID id,
...
String name) {
this.id = id
...
this.name = name;
}

@Id
@Column(name = "id", nullable = false, updatable = false, unique = true)
protected UUID id;

...

@Column(name = "name", nullable = false)
private String name;
}

Код: Выделить всё

 @Entity
@Table(name = "display_name")
@NoArgsConstructor
@ToString()
@Getter
@Setter
public class DisplayName {

@Builder
public DisplayName(
String systemName,
String displayName) {
this.systemName = systemName;
this.displayName = displayName;
}

@Id
@Column(name = "system_name", nullable = false)
private String systemName;

@Column(name = "display_name", nullable = false)
private String displayName;
И теперь я хочу использовать свой репозиторий JPA для продуктов, чтобы выполнить что-то похожее на этот запрос, который извлекает данные из обеих таблиц:

Код: Выделить всё

 SELECT * FROM product
LEFT JOIN display_name
ON name = system_name;
Это отношение один к одному, что означает, что каждое имя в Product сопоставляется с одним system_name и наоборот
поэтому я добавил несколько внешних ключей (не уверен, нужны ли они)

Код: Выделить всё

ALTER TABLE display_name
ADD CONSTRAINT fk_system_name
FOREIGN KEY (system_name) REFERENCES product (`name`) ON DELETE CASCADE;

ALTER TABLE product
ADD CONSTRAINT fk_name
FOREIGN KEY (`name`) REFERENCES display_name (system_name) ON DELETE CASCADE;
затем я добавил поле «один к одному» в поле «Продукт для отображаемого имени».

Код: Выделить всё

   @OneToOne()
@JoinTable(
name = "display_name",
joinColumns = {@JoinColumn(name = "system_name")},
inverseJoinColumns = {@JoinColumn(name = "name")})
@Exclude
private DisplayName displayName;
Итак, теперь у меня есть репозиторий jpa, из которого я хочу получить все значения продукта

Код: Выделить всё

 public interface ProductRepository
extends JpaRepository
, JpaSpecificationExecutor {
Page findAllByName(String name);
}
но когда я вызываю findAllByName в контроллере отдыха, я получаю следующую ошибку

Код: Выделить всё

2024-11-16 10:38:07 2024-11-16 15:38:07.706 ERROR 1 --- [io-10005-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.dao.InvalidDataAccessResourceUsageException: JDBC exception executing SQL [
select p1_0.id,p1_0.name,p1_2.name from product p1_0 left join display_name p1_2 on p1_0.id=p1_2.system_name [(conn=76324) Unknown column 'p1_2.name' in 'field list'] [n/a]; SQL [n/a]] with root cause []
2024-11-16 10:38:07
2024-11-16 10:38:07 java.sql.SQLSyntaxErrorException: (conn=76324) Unknown column 'p1_2.name' in 'field list'
и я не уверен, почему он присоединяется к product.id на display_name.system_name и ищет display_name.name, когда это не завершается? Вероятно, я неправильно настроил поле @OneToOne, но не совсем уверен, каким должен быть правильный синтаксис. Заранее спасибо за любую помощь

Подробнее здесь: https://stackoverflow.com/questions/791 ... own-column
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»