Я полагаю, у вас есть следующие настройки:
@Entity
@Table(name="A")
class A {
@ManyToOne
@JoinColumn(name="CLOTH_ID")
private B cloth;
//...
}
@Entity
@Table(name="B")
class B {
@Id
@Column(name="CLOTH_ID")
private int id;
@Column(name="CLOTH_DESCRIPTION")
private String description;
//...
}
Если вы не ... вы делаете это неправильно (т.е. это не идиоматическое использование JPA). У вас есть следующие варианты:
Просто получить A
В этом случае @ManyToOne
связь будет по умолчанию также выбрана. Тогда просто позвоните в Java:
a.getCloth().getDescription()
Предпочитаю этот подход, так как он самый простой и самый идиоматический, если только число столбцов в B не равно огромно .
Использовать запрос JPA с пользовательскими столбцами:
SELECT a, a.b.description
FROM A a
WHERE a.id = :id
В этом случае запрос возвращает List<Object[]>
, где Object[]
фактически содержит два элемента: A
и String
.
То же, что и выше, но с пользовательским DTO:
class Adto {
private final A a;
private final String description;
public Adto(A a, String description) {
this.a = a;
this.description = description;
}
}
И немного измененный запрос:
SELECT new Adto(a, a.b.description)
FROM A a
WHERE a.id = :id