Я работаю над API и пытаюсь использовать @RepositoryRestResource для получения разбитых на страницы результатов. Это прекрасно работает с одной сущностью и хранилищем. Когда у этой сущности есть двунаправленный дочерний элемент @ OneToMany / @ ManyToOne, вызовы дочерней конечной точки не возвращают элемент страницы. Я сделал пример для демонстрации. Для данного приложения:
@SpringBootApplication
public class NestedDataJpaApplication {
public static void main(String[] args) {
SpringApplication.run(NestedDataJpaApplication.class);
}
}
Объекты моей модели:
@Entity
public class Company {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String name;
public Long getId() {
return id;
}
public String getName() {
return name;
}
@OneToMany(targetEntity = Division.class, mappedBy = "company")
private List<Division> divisions = new ArrayList<>();
public List<Division> getDivisions() {
return divisions;
}
}
@Entity
public class Division {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
String name;
@ManyToOne
private Company company;
public Long getId() {
return id;
}
public String getName() {
return name;
}
public Company getCompany() {
return company;
}
}
И хранилища ресурсов:
@RepositoryRestResource
public interface CompanyRepository extends PagingAndSortingRepository<Company, Long> {}
@RepositoryRestResource
public interface DivisionRepository extends PagingAndSortingRepository<Division, Long> {}
После запуска приложения создайте компанию с:
curl --location --request POST 'http://localhost:8080/companies'
--header 'Content-Type: application/json'
--data-raw '{
"name":"Microsoft"
}'
Теперь извлеките результаты, чтобы увидеть информацию о нумерации страниц внизу:
curl --location --requestGET 'http://localhost:8080/companies'{
{
"_embedded" : {
"companies" : [ {
"name" : "Microsoft",
"_links" : {
"self" : {
"href" : "http://localhost:8080/companies/1"
},
"company" : {
"href" : "http://localhost:8080/companies/1"
},
"divisions" : {
"href" : "http://localhost:8080/companies/1/divisions"
}
}
} ]
},
"_links" : {
"self" : {
"href" : "http://localhost:8080/companies{?page,size,sort}",
"templated" : true
},
"profile" : {
"href" : "http://localhost:8080/profile/companies"
}
},
"page" : {
"size" : 20,
"totalElements" : 1,
"totalPages" : 1,
"number" : 0
}
}
Добавьте деление:
curl --location --request POST 'http://localhost:8080/divisions'
--header 'Content-Type: application/json'
--data-raw '{
"name":"Windows",
"company":"http://localhost:8080/companies/1"
}'
Теперь при извлечении делений обратите внимание отсутствующий раздел страницы:
curl --location --request GET 'http://localhost:8080/companies/1/divisions'
{
"_embedded" : {
"divisions" : [ {
"name" : "Windows",
"_links" : {
"self" : {
"href" : "http://localhost:8080/divisions/2"
},
"division" : {
"href" : "http://localhost:8080/divisions/2"
},
"company" : {
"href" : "http://localhost:8080/divisions/2/company"
}
}
} ]
},
"_links" : {
"self" : {
"href" : "http://localhost:8080/companies/1/divisions"
}
}
}
Ожидаемое поведение - дочерний элемент будет иметь раздел страницы так же, как родительский.