2015-11-25 2 views
0

В Spring Data можно расширить запрос, который генерируется функциями find * интерфейсов репо?Крюк запроса хранилища Spring Data

Учитывая следующий случай использования:

Моя база данных имеет наследие наследство по таблице. Поэтому, учитывая следующее

@Entity public class Person { 
    private int id; 
    private String className; 
} 

@Entity @PrimaryKeyJoinColumn(name="id") public class Musician extends Person { 
    String instrument; 
} 

@Entity @PrimaryKeyJoinColumn(name="id") public class Lawyer extends Person { 
    String discipline; 
} 

Мой репозиторий для музыканта:

public interface MusicianRepository extends CrudRepository<Musician, int> { 
    List<Musician> findAll(); 
} 

Теперь запись для нового музыканта в SQL будет:

insert into Person(id, className) values(1, 'Musician'); 
insert into Musician(id, instrument) values(1, 'piano'); 

Когда музыкант получил мигрировали к адвокату старая система добавила один ряд в таблицу юристов без удаления Музыканта:

insert into Lawyer(id, discipline), values(1, 'finance'); 
update Person set ClassName = 'Lawyer' where ID = 1; 

My MusicianRepo теперь найдет адвоката, так как ряд в Музыканте все еще существует.

Мне нужен какой-то постпроцессор, где я мог бы расширить запрос, добавив предложение where с «ClassName = 'Musician» на всех методах find *.

Возможно ли это как-то?

ответ

1

Я думаю, что ваше сопоставление JPA просто неверно с точки зрения наследования.

Я думаю, что вы хотите иметь «Регистрация, многоуровневые таблицы наследования»

Ссылаясь от here:

Регистрация Наследование является наиболее логичным решением наследования, потому что отражает модель объекта в модель данных. В объединенном наследовании таблица определена для каждого класса в иерархии наследования для хранения только локальных атрибутов этого класса. Каждая таблица в иерархии также должна хранить идентификатор объекта (первичный ключ), который задан только в корневом классе. Все классы в иерархии должны иметь один и тот же идентификатор . Столбец дискриминатора используется для определения того, к какому классу принадлежит определенная строка , каждый класс в иерархии определяет свое собственное уникальное значение дискриминатора .

Некоторые поставщики JPA поддерживают объединенное наследование с или без столбца дискриминатора , некоторые требуют столбца дискриминатора, а некоторые не поддерживают столбец дискриминатора. Таким образом, объединенное наследование делает , похоже, пока не полностью стандартизировано.

Столбец className в Person будет вашим столбцом дискриминатора. Он определяет подкласс для создания экземпляра.

Ваше отображение будет что-то вроде этого:

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
@DiscriminatorColumn(name="className") 
public class Person { 
     private int id; 
     private String className; 
    } 

@Entity 
@DiscriminatorValue("Musician") 
public class Musician extends Person { 
     String instrument; 
    } 

    @Entity 
@DiscriminatorValue("Lawyer") 
public class Lawyer extends Person { 
     String discipline; 
    } 

Таким образом, если вы запрашиваете Lawyer лиц JPA автоматически добавить где положение только для чтения строк с Classname = Lawyer

Я не пробовал отображение - это должно просто проиллюстрировать, как вы должны идти.

+0

Привет, он соединяется, но не добавляет необходимое условие для className в предложение where команды sql. – rainerhahnekamp

Смежные вопросы