Spring Data JPA で遊んでみる 〜その3〜
その2の続きです。
前回あった
List<T> findAll(Sort sort);
というSortという面白そうなのがあるので、使ってみます。基本は、Sortをnewして使うのですが、Orderクラスと絡ませたり、Stringでプロパティで食わせたりと、幾つかアプローチがあるので、掻い摘んで紹介します。
まず基本。
@Test public void findAll_初めてのソート() throws Exception { // 一番シンプルなやり方 List<Emp> emps = repository.findAll(new Sort(ASC, "name")); assertThat(emps.size(), is(not(equalTo(0)))); for (int i = 0; i < emps.size() - 1; i++) { if (emps.get(i).getName().compareTo(emps.get(i + 1).getName()) > 0) { fail(); } } // 上の指定と同じ emps = repository.findAll(new Sort(new Order(ASC, "name"))); assertThat(emps.size(), is(not(equalTo(0)))); }
基本は ASC or DESC どちらかを指定して ソートで使用するプロパティを文字列で指定します。OrderBySourceというASC or DESCの指定、複数のプロパティの組み合わせを、ひとつのStringで定義できるというやつもいます。
@Test public void findAll_sort_OrderBySourceを使う() throws Exception { List<Emp> emps = repository.findAll(new OrderBySource("NameAsc").toSort()); assertThat(emps.size(), is(not(equalTo(0)))); }
関連クラスのプロパティを指定といったことも可能ですし、複数のキーを設定するということも出来ます。
@Test public void findAll_sort_関連クラスのプロパティを指定() throws Exception { List<Emp> emps = repository.findAll(new Sort(new Order(DESC, "dept.id"), new Order(ASC, "name"))); assertThat(emps.size(), is(not(equalTo(0)))); // OrderBySourceを使用した例、上と同じ意味 emps = repository.findAll(new OrderBySource("DeptIdDescNameAsc", Emp.class).toSort()); assertThat(emps.size(), is(not(equalTo(0)))); }
サンプルコードはこのへん
https://github.com/yamkazu/springdata-jpa-example/tree/usesort