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