Spring Data Rest запрос с конкретными результатами

0

Я использую 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();
}

Пожалуйста, помогите мне!

  • 0
    Передайте параметры запроса в URL и отфильтруйте результат в бэкэнде
  • 0
    Хорошо, а как я могу это сделать?
Показать ещё 8 комментариев
Теги:
httprequest
request
spring-data

1 ответ

1

Если вы хотите уменьшить количество информации, которую вы можете рассмотреть при проектировании, я могу предложить прочитать документ по этой теме " Проекция".

рассмотрите модель, подобную болоу:

 @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 должен находится в том же пакете (или суб-пакет) типа домена.

Я опубликовал несколько экранов для документа, как я хочу сказать. [ Изображение 1745512 ]

Изображение 174551

Изображение 174551

Если этого подхода недостаточно, следует подумать о том, чтобы построить собственный собственный 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, я хочу этого поведения.

Надеюсь, теперь ясно.

  • 0
    Здравствуйте, я только что отредактировал свой репозиторий, как в вашем примере, и изменил свой запрос на " localhost: 8080 / праздничные дни? Projection = noHolidayweek ", но запрос дает мне те же данные, что и раньше.
  • 0
    Я обновил свой answare и надеюсь, что он поможет вам понять мои подсказки
Показать ещё 31 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню