У меня есть отношения OneToMany в моей БД, но я не хочу, чтобы Hibernate управлял им напрямую.JPA: левое объединение без @OneToMany аннотации
Этих отношений являются переводами, а DTO представляет собой переведенный реестр:
@Entity
@Table(name = "my_table")
public class MyTable {
@Id
@Column(name = "id", nullable = false, unique = true)
private Integer id;
@Transient
private String lang;
@Transient
private String text;
// getters and setters
...
}
@Entity
@Table(name = "my_table_translation")
public class MyTableTranslation {
@Id
@Column(name = "id", nullable = false, unique = false)
private Integer id;
@Id
@Column(name = "lang", nullable = false, unique = false, length = 2)
private String lang;
@Column(name = "text", nullable = false, unique = false, length = 200)
private String text;
// getters and setters
...
}
Я хочу иметь конкретный FindAll метод (String языков) с параметром Ланга, и использовать критерии Specification, чтобы построить запрос. Нечто подобное:
public void findAll(String language) {
List<MyTable> list = repository.findAll(new Specification<MyTable>() {
@Override
public Predicate toPredicate(Root<MyTable> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
// something there
return ...;
}
});
}
Дело в том, что я не знаю, как сделать это, потому что я не могу использовать JOIN положение, так как я не атрибут в модели, которая представляет отношения.
Я пытался использовать SELECT ... FROM ... LEFT JOIN запрос с SQL нотации,
SELECT t1, t2 FROM MyTable t1 LEFT JOIN MyTableTranslation t2 ON t1.id = t2.id
и он работает, но не по своему желанию. Результирующий список объектов - это список из 2 объектов для каждого элемента: один - это объект MyTable, а другой - связанный объект MyTableTranslation. Мне нужно проанализировать список и программно построить объекты с помощью класса PropertyUtils из библиотеки Apache Commons.
Неплохо, я думаю ... Кто-нибудь знает, как сделать это легко, без использования нотации SQL?
Было бы намного чище, чтобы определить '@ OneToMany' отношения в ваших лиц. Можете ли вы объяснить, почему вы не хотите использовать этот подход? –
Причина не в том, чтобы позволить JPA управлять этими отношениями. Представьте, что мое приложение работает на испанском языке. Я не хочу извлекать в атрибуте все Языки, но только испанский язык. Вы знаете, можно ли это сделать? Заранее спасибо. –
Вы все равно должны определить отношения как OneToMany, но затем укажите в своих критериях, что вы хотите только испанский, чтобы вы не получали языки, которые вам не нужны. –