Я использую Spring Data REST и Angular для создания веб-сайта, который подключен к моей mySQL-DB.
С таким http-запросом я получу свои данные:
$scope.getAllHolidays = function(){
var URL = String('http://localhost:8080/holidays?projection=noHolidayweek');
$http({
url: URL,
method: 'GET',
contentType: 'application/json'
})
.then(useData);
};
Теперь он принесет мне все праздники с их информацией (включая данные, соединенные внешним ключом). Мой результат выглядит так:
"_embedded" : {
"holidays" : [ {
"strTitle" : "Summer 2016",
"byteHolidayReason" : 0,
"bolEnabled" : false,
"holidayweek" : [ {
"shortYear" : 2016,
"byteWeek" : 29,
"occupancy" : [ { <-- joined table
"intNumber" : 0,
}, {
"intNumber" : 3,
}, {
"intNumber" : 2,
{ AND SO ON (LARGE ARRAY) }]
}]
Но моя проблема в том, что я хочу получить конкретную информацию без данных из соединения, потому что она содержит много данных и бесполезна на данный момент.
UPDATE: я добавил модель и контроллер и создал Projection для моего репозитория, как предлагал мне @Valerio Vaudi, но он все равно не работает.
Моя модель (main.holiday.model):
@Entity
public class Holiday {
public Holiday(){
}
@Id
@Column(name="holiday_id")
private Long LongHoliday_id = main.modules.calcID.calculateID();
@Column(name="Title")
private String strTitle;
@Column(name="HolidayReason")
private byte byteHolidayReason;
//0=Sommer
//1=Winter
@Column(name="Enabled")
private boolean bolEnabled;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "holiday_id")
private Set<Holidayweek> holidayweeks = new HashSet<Holidayweek>();
//setter & getter
Мой репозиторий (main.holiday.controller):
public interface HolidayRepository extends PagingAndSortingRepository<Holiday, Long>,
QueryDslPredicateExecutor<Holiday> {
}
@Projection(name = "noHolidayweek", types = {Holiday.class})
interface NoHolidayweek{
Long getLongHoliday_id();
String getStrTitle();
Byte getByteHolidayReason();
Boolean getBolEnabled();
}
Пожалуйста, помогите мне!
Если вы хотите уменьшить количество информации, которую вы можете рассмотреть при проектировании, я могу предложить прочитать документ по этой теме " Проекция".
рассмотрите модель, подобную болоу:
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String lastName;
private String street;
private String city;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Address> addressList;
…
}
предположим, что у него слишком подробная информация, и вы хотите меньше информации, которую можете сделать, например, болоу:
объявить интерфейс, как показано ниже
@Projection(name = "personProjectionCriteria", types = Person.class)
public interface PersonProjectionCriteria {
String getFirstName();
String getLastName();
}
@RepositoryRestResource(excerptProjection = PersonProjectionCriteria.class)
public interface PersonRepository extends CrudRepository<Person, Long> {
}
затем используйте его в своем URL-адресе, как показано ниже.
http://localhost: 8080/person ? projection = personProjectionCriteria.
Обновление является важным мозговым является то, что интерфейс помечен как @Projection должен находится в том же пакете (или суб-пакет) типа домена.
Я опубликовал несколько экранов для документа, как я хочу сказать. [ 2 ]
Если этого подхода недостаточно, следует подумать о том, чтобы построить собственный собственный api с классическим подходом Spring MVC или JAx-RS и выполнить мелкозернистую настройку.
Я надеюсь, что это может помочь вам
Обновление После вашего поста кода я пытаюсь исправить ошибки, а в моем githHub по коду ссылки вы можете найти решение. В разветвленном репо вы можете увидеть, что многие изменились, потому что в вашем коде во время fork 05/08/2016 я обнаружил много ошибок в макете кода и в самом коде. Регулярно в опубликованном коде ваша ошибка не существует, поскольку вы определяете объект с зависимостью, но после определения интерфейсов репозитория для этих объектов. Весенние данные в этом случае заменят встроенную зависимость ссылкой. В самом деле, если вы не определяете интерфейс репозитория, например, ниже Spring data rest будет вставлять вложенное отношение сущности, и вы получите проблему, описанную в вашем вопросе.
@RepositoryRestResource
public interface HolidayweekRepository extends PagingAndSortingRepository<Holidayweek, Long> {
}
Единственный способ преодолеть это - определить проецирование и применить его, как описано выше в моих сообщениях. в вашем коде я нахожу проецирование в контроллере pakage, а не в модели pakage, и для того, чтобы вы могли воспользоваться проекцией.
В ссылке forked repo я скорректировал код таким образом, чтобы yon не получал данные по отношению, но вы получаете ссылку, если вы этого не хотите, и вы хотите получить выгоду от использования проекции, вы удалили интерфейс репозитория и определить интерфейс проекции под пакией модели, а не pakage контроллера и intert excerptProjection = NoHolidayweek.class, если вы хотите, чтобы проекция была применена по умолчанию в URL-адресе /holidays или не вставлять ее в @RepositoryRestResource, я хочу этого поведения.
Надеюсь, теперь ясно.