DATAREST-976 - Embedded properties are now considered in sort property paths.

We now allow sorting by properties of embedded objects. An embedded object is not linkable to a root object but embedded in the resource itself. If any part of the sort property path points to a linkable association, the whole sort property path is discarded silently and not used for sorting any further.

Original pull request: #251.
This commit is contained in:
Mark Paluch
2017-01-10 14:19:02 +01:00
committed by Oliver Gierke
parent 629ca4e33d
commit ffe96e4079
7 changed files with 63 additions and 16 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2013-2016 the original author or authors.
* Copyright 2013-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,10 +15,15 @@
*/
package org.springframework.data.rest.webmvc.jpa;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Embeddable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@@ -45,9 +50,11 @@ public class Book {
@RestResource(path = "creators") //
public Set<Author> authors;
public Offer offer;
protected Book() {}
public Book(String isbn, String title, long soldUnits, Iterable<Author> authors) {
public Book(String isbn, String title, long soldUnits, Iterable<Author> authors, Offer offer) {
this.isbn = isbn;
this.title = title;
@@ -59,5 +66,17 @@ public class Book {
author.books.add(this);
this.authors.add(author);
}
this.offer = offer;
}
@Getter
@Embeddable
@AllArgsConstructor
@NoArgsConstructor
static class Offer {
double price;
String currency;
}
}

View File

@@ -494,12 +494,12 @@ public class JpaWebTests extends CommonWebTests {
assertThat(findBySortedLink.getVariableNames(), hasItems("sort", "projection"));
// Assert results returned as specified
client.follow(findBySortedLink.expand("title,desc")).//
client.follow(findBySortedLink.expand("offer.price,desc")).//
andExpect(jsonPath("$._embedded.books[0].title").value("Spring Data (Second Edition)")).//
andExpect(jsonPath("$._embedded.books[1].title").value("Spring Data")).//
andExpect(client.hasLinkWithRel("self"));
client.follow(findBySortedLink.expand("title,asc")).//
client.follow(findBySortedLink.expand("offer.price,asc")).//
andExpect(jsonPath("$._embedded.books[0].title").value("Spring Data")).//
andExpect(jsonPath("$._embedded.books[1].title").value("Spring Data (Second Edition)")).//
andExpect(client.hasLinkWithRel("self"));

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2013-2016 the original author or authors.
* Copyright 2013-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@ package org.springframework.data.rest.webmvc.jpa;
import java.util.Arrays;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.rest.webmvc.jpa.Book.Offer;
/**
* @author Jon Brisbin
@@ -54,8 +55,8 @@ public class TestDataPopulator {
Iterable<Author> authors = this.authors.save(Arrays.asList(ollie, mark, michael, david, john, thomas));
books.save(new Book("1449323952", "Spring Data", 1000, authors));
books.save(new Book("1449323953", "Spring Data (Second Edition)", 2000, authors));
books.save(new Book("1449323952", "Spring Data", 1000, authors, new Offer(21.21, "EUR")));
books.save(new Book("1449323953", "Spring Data (Second Edition)", 2000, authors, new Offer(30.99, "EUR")));
}
private void populateOrders() {