Spring DataでfindAllでOrderByを使用する方法


288

私は春のデータを使用しており、DAOは次のようになります

public interface StudentDAO extends JpaRepository<StudentEntity, Integer> {
    public findAllOrderByIdAsc();   // I want to use some thing like this
}

上記のコードでは、コメント行が私の意図を示しています。Spring Dataは、ASC / DESCのある列ですべてのレコードの順序を見つけるためにそのような方法を使用する組み込み機能を提供できますか?

回答:


657
public interface StudentDAO extends JpaRepository<StudentEntity, Integer> {
    public List<StudentEntity> findAllByOrderByIdAsc();
}

上記のコードは動作するはずです。私は似たようなものを使用しています:

public List<Pilot> findTop10ByOrderByLevelDesc();

最高レベルの10行を返します。

重要: この回答の要点を見逃しがちであると言われているので、ここで少し説明します。

findAllByOrderByIdAsc(); // don't miss "by"
       ^

4
メソッドシグネチャをSpring Data JPAで意図したとおりに機能させるには、次のように「all」キーワードを含める必要がありますList<StudentEntity> findAllByOrderByIdAsc();。戻り値の型を追加し、冗長なパブリック修飾子を削除することも良い考えです;)
HåvardGeithus

1
publicは冗長であることに同意しますが、他の誰かがあなたのコードに取り組む必要がある場合に備えて、物事を明確にします。それが誰になるかは決してわかりません:PIは作成者のコードでメソッド名以外は何も変更しませんでした。問題があった場所ではなく、誰かがそこに何があるべきかわからない場合、うまくいけば彼らは何か新しいことを学ぶでしょう。その上、それは以下の私の例にあるので、彼らは神を検索する必要はありませんが、あなたが主張するならば、そうなるでしょう:) 'all'キーワードを追加しました。ありがとう。
Sikor 2015

73
キーワードの少しByOrderByがすべての違いになることに注意してください。
Stefan Haberl 2015

5
それでもBy、の前に余分を追加する必要がある理由がわかりませんOrderByドキュメントには、それについて教えてくれありません
Xtreme Biker

3
@XtremeBiker提供したドキュメントリンクから:「ただし、最初のByは、実際の基準の開始を示す区切り文字として機能します。」また、「3.4.5。クエリ結果の制限」までスクロールすると、実際にこのような例がありますが、説明はありません。
Sikor

54

私の知る限り、これは直接メソッド命名クエリでは可能ではないと思います。ただし、Sortクラスを使用して、組み込みの並べ替えメカニズムを使用できます。リポジトリにはfindAll(Sort)、インスタンスを渡すことができるメソッドがありますSort。例えば:

import org.springframework.data.domain.Sort;

@Repository
public class StudentServiceImpl implements StudentService {
    @Autowired
    private StudentDAO studentDao;

    @Override
    public List<Student> findAll() {
        return studentDao.findAll(sortByIdAsc());
    }

    private Sort sortByIdAsc() {
        return new Sort(Sort.Direction.ASC, "id");
    }
} 

これは、以下の Sikor の回答で述べたように、findAllByOrderByIdAsc()を使用して実際に可能です... @Prashantは、正解である必要があります
Samuel Parsonage

リポジトリが煩雑にならないようにしたい場合は、サービス層で並べ替えを行う別の方法。ただし、結果のサイズに注意してください。
dkanejs 2016年

2
findAll()型のメソッドCrudRepository<>は引数に適用できません(ソート)
Thiago Pereira

5
JpaRepository<>上記の例を使用する場合は、@ ThiagoPereiraを拡張する必要があります。
Waleed Abdalmajeed

15

Spring Data JPA-リファレンスドキュメントのセクション5.3をご覧くださいクエリメソッド(特にセクション5.3.2)。クエリの作成、「表3.メソッド名内でサポートされるキーワード(2019-05-03現在のリンク)。

私はそれがあなたが必要とするものを正確に持ち、あなたが述べたのと同じクエリがうまくいくはずだと思います...


1
:>私はあなたがこのリンクに向けてのポイントに望んでいたと仮定-あなたのリンクは動作しません docs.spring.io/spring-data/jpa/docs/current/reference/html/...
ヨルゲンSKÄRフィッシャー


3

はい、Spring Dataのクエリメソッドを使用してソートできます。

例:idフィールドの値を使用した昇順または降順。

コード:

  public interface StudentDAO extends JpaRepository<StudentEntity, Integer> {
    public findAllByOrderByIdAsc();   
}

代替ソリューション:

    @Repository
public class StudentServiceImpl implements StudentService {
    @Autowired
    private StudentDAO studentDao;

    @Override
    public List<Student> findAll() {
        return studentDao.findAll(orderByIdAsc());
    }
private Sort orderByIdAsc() {
    return new Sort(Sort.Direction.ASC, "id")
                .and(new Sort(Sort.Direction.ASC, "name"));
}
}

春のデータの並べ替え:並べ替え


3

この例では、OrderByの並べ替えをパーソナライズするための完全な例を示します

 import java.util.List;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.repository.*;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 import org.springframework.data.domain.Sort;
 /**
 * Spring Data  repository for the User entity.
 */
 @SuppressWarnings("unused")
 @Repository
 public interface UserRepository extends JpaRepository<User, Long> {
 List <User> findAllWithCustomOrderBy(Sort sort);
 }

この例を使用します。Sortのインスタンスであるオブジェクトを動的に構築するためのメソッド:

import org.springframework.data.domain.Sort;
public class SampleOrderBySpring{
 Sort dynamicOrderBySort = createSort();
     public static void main( String[] args )
     {
       System.out.println("default sort \"firstName\",\"name\",\"age\",\"size\" ");
       Sort defaultSort = createStaticSort();
       System.out.println(userRepository.findAllWithCustomOrderBy(defaultSort ));


       String[] orderBySortedArray = {"name", "firstName"};
       System.out.println("default sort ,\"name\",\"firstName\" ");
       Sort dynamicSort = createDynamicSort(orderBySortedArray );
       System.out.println(userRepository.findAllWithCustomOrderBy(dynamicSort ));
      }
      public Sort createDynamicSort(String[] arrayOrdre) {
        return  Sort.by(arrayOrdre);
        }

   public Sort createStaticSort() {
        String[] arrayOrdre  ={"firstName","name","age","size");
        return  Sort.by(arrayOrdre);
        }
}

0

上記のすべての回答を組み合わせると、BaseEntityで再利用可能なコードを記述できます。

@Data
@NoArgsConstructor
@MappedSuperclass
public abstract class BaseEntity {

  @Transient
  public static final Sort SORT_BY_CREATED_AT_DESC = 
                        Sort.by(Sort.Direction.DESC, "createdAt");

  @Id
  private Long id;
  private LocalDateTime createdAt;
  private LocalDateTime updatedAt;

  @PrePersist
  void prePersist() {
    this.createdAt = LocalDateTime.now();
  }

  @PreUpdate
  void preUpdate() {
    this.updatedAt = LocalDateTime.now();
  }
}

DAOオブジェクトはfindAllメソッドをオーバーロードします-基本的に、まだ使用します findAll()

public interface StudentDAO extends CrudRepository<StudentEntity, Long> {

  Iterable<StudentEntity> findAll(Sort sort);

}

StudentEntityBaseEntity繰り返し可能なフィールドを含む拡張(IDで並べ替えることもできます)

@Getter
@Setter
@FieldDefaults(level = AccessLevel.PRIVATE)
@Entity
class StudentEntity extends BaseEntity {

  String firstName;
  String surname;

}

最後に、そのサービスと使用法はSORT_BY_CREATED_AT_DESC、おそらくだけでなく使用されStudentServiceます。

@Service
class StudentService {

  @Autowired
  StudentDAO studentDao;

  Iterable<StudentEntity> findStudents() {
    return this.studentDao.findAll(SORT_BY_CREATED_AT_DESC);
  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.