Не удалось разрешить свойство дочерней таблицы @OneToMany (@JoinColumn) - PullRequest
0 голосов
/ 07 января 2020

Я получаю вышеуказанную ошибку при попытке выполнить пользовательский запрос. Я понимаю, что в спящем режиме вам необходимо сопоставить имена entity (не имена column). Однако в случае @OneToMany у меня нет столбца в дочернем элементе. Позвольте мне объяснить на простом примере (я удалил все остальные столбцы и методы):

@Query("SELECT ch.randomColumnHere FROM Parent pa INNER JOIN Child ch ON pa.id = ch.parent_id")

Parent.class

@Entity(name="Parent")
@Table(name="parent")
@Builder(toBuilder = true)
@AllArgsConstructor(access = AccessLevel.PACKAGE)
@NoArgsConstructor
@Setter
@Getter
public class Parent {

    @Id
    @SequenceGenerator(name = "parent_id_seq", sequenceName = "parent_id_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "parent_id_seq")
    private Long id;
    @OneToMany (cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "parent_id", nullable = false, updatable = false)
    private List<Child> children;

}

Child .class

@Entity(name="Child")
@Table(name="child")
@Builder(toBuilder = true)
@AllArgsConstructor(access = AccessLevel.PACKAGE)
@NoArgsConstructor
@Setter
@Getter
public class Child {

    @Id
    @SequenceGenerator(name = "child_id_seq", sequenceName = "child_id_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "child_id_seq")
    private Long id;

    @Column(name="randomcolumnhere")
    private Double randomColumnHere;
}

Я получаю следующее исключение:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: could not resolve property: parent_id

Я понимаю, что field с именем parent_id в Child entity. Как я могу обойти это? Поскольку единственной «ссылкой» на столбец parent_id является @JoinColumn класса Parent.

Есть предложения?

Ответы [ 2 ]

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

HQL-запросы используют сущности и их ассоциации. Тот факт, что ассоциация использует таблицу соединений или нет, не имеет значения для HQL: вы перемещаетесь по ассоциациям, и Hibernate делает соответствующий перевод на SQL.

SELECT ch.randomColumnHere FROM Parent pa INNER JOIN pa.children ;

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

Добавьте отношение в дочерний класс следующим образом и измените запрос соответствующим образом.

    @ManyToOne
    private Parent p;

    @Query("SELECT ch.randomColumnHere FROM Parent pa INNER JOIN Child ch ON pa.id = ch.p.id")
...