Предпосылка
Недавно мне было поручено работать с приложением Java + JPA + Hibernate.
Это приложение имеет 4 разных «модуля», каждый из которых представляет собой «копирование + вставка» друг друга, с небольшими изменениями.
Я хочу удалить все дубликаты и работать с одной схемой базы данных (в настоящее время существует одна схема для каждого «модуля»).
Я пытаюсь начать как можно менее "инвазивным" способом, не слишком меняя то, что уже есть.
То, что я сделал, было:
- Я создал базовый модуль и перенес туда несколько спящих объектов.
- Я сделал эти сущности абстрактными и создал реализации для каждого модуля.
- Я создаю новую схему и перемещаю в нее все остальные записи модуля (сейчас мне пришлось отключить ограничения базы данных).
* * 1 022 Пример: * 1 023 *
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "SYSTEM", length = 10, discriminatorType = DiscriminatorType.STRING)
@Table(name = "GROUP")
public abstract class Group<U extends UserGroup> {
@Id
private Integer id;
@Column(name = "CODE")
private String code;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "group")
private List<U> users;
@Entity
@Table(name = "USER_GROUP")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "SYSTEM", length = 10, discriminatorType = DiscriminatorType.STRING)
public abstract class UserGroup<G extends Group> {
@Id
private Integer id;
@Column(name = "name")
private String name;
@ManyToOne(optional=false)
@JoinColumn(name = "GROUP_ID", referencedColumnName = "ID", insertable=false, updatable=false)
private G group;
Реализации просто определяют столбец дискриминатора.
Выпуск
Следующий запрос:
public interface UserGroupRepository<T extends UserGroup> extends CrudRepository<T, Integer> {
@Query(value = "select grp.code from #{#entityName} ug join ug.group grp where ug.name= ?1")
Iterable<String> listGroupByUser(String name);
Возвращает 4 элемента, потому что у моего пользователя есть запись для каждого модуля в базе данных (он должен возвращать только 1 элемент).
Вопрос
Используя "@Query", можно ли как-то правильно фильтровать по значению дискриминатора?