2016-07-27 38 views
0

我正在使用Spring Data REST和Angular構建一個連接到mySQL-DB的網站。具有特定結果的Spring Data Rest請求

有了這樣的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: 我說我的模型和控制器,並創建了一個投影到我的倉庫就像@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中傳遞查詢參數並在後端過濾結果 – Ved

+0

好的,我該怎麼做? – Phil

+0

您的意思是提出一個正常的請求,然後過濾不相關的數據? – Phil

回答

1

如果你想減少信息量,你可以考慮投影技術,我可以建議閱讀關於這個主題的文檔Projection

考慮像bolow模型:

@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; 
     … 
    } 

假設它有太多mutch信息和你想你可以做這樣bolow較少資訊:

聲明接口像下面

@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的接口必須位於域類型的相同包(或子包)中。

我張貼了一些屏幕文件,我想說什麼。 [all resource2]

projected

code

如果這種做法是不夠的馮應考慮與經典的Spring MVC和JAX-RS的方式建立自己的REST API,並執行罰款粒度調整。

我希望它可以幫助你

更新 的你的後置代號之後,我嘗試修復的錯誤,並在我的githHub在鏈接code你可以找到解決方案。在分叉的repo中,你可以看到很多改變,因爲在fork 05/08/2016的代碼中,我發現代碼佈局和代碼本身存在很多錯誤。在發佈的代碼中,你的bug並不存在,事實上你定義了一個具有依賴關係的實體,但是在爲這個實體定義一個存儲庫接口之後。在這種情況下,Spring數據休息將用鏈接替換嵌入的依賴項。事實上,如果你沒有像下面那樣定義一個存儲庫接口,Spring數據休息會插入嵌入式實體關係,並且你會遇到問題中描述的問題。

@RepositoryRestResource 
public interface HolidayweekRepository extends PagingAndSortingRepository<Holidayweek, Long> { 

} 

的唯一出路克服的是定義投影並把它作爲我在上面answares描述。在你的代碼中,我發現投影在控制器pakage中,而不是在模型pakage中,並且由於這個原因你繼續投影的好處。

在分叉回購的鏈接我糾正了代碼的方式,你沒有得到關係的數據,但你得到的鏈接,如果你不想要它,你想要使用投影你有刪除的好處關係實體的存儲庫接口,並定義投影界面在模型pakage下,而不是控制器pakage和intert excerptProjection = NoHolidayweek.class,如果您希望投影將默認應用於/ holidays網址或不插入到@RepositoryRestResource中如果你不想要這種行爲。

我希望現在很清楚。

+0

你好,我剛剛在你的例子中編輯了我的Repository,並將我的請求改爲「http:// localhost:8080/holidays?projection = noHolidayweek」,但請求給了我和以前相同的數據。 – Phil

+0

我已經更新了我的answare,我希望它能幫助你理解我的提示 –

+0

它適用於我 –